 《深入浅出MFC》2/e骨干程序。所谓骨干程序,是指Visual C++ 的工具AppWizard 所产生出来的程序代码。当然,AppWizard 会根据你的选项做出不同 的程序代码,我所据以解说的,是大众化选项下的产品。 第四篇以微软公司附于Visual C++ 光盘片上的一个范例程序Scribble 为主轴,一步一步加 上新的功能。并在其间深入介绍Runtime Type Information(RTTI)、Dynamic 验的朋友,不见得不会对本篇感到惊艳。根据我的了解,太多人使用MFC 是「只知道 这么做,不知道为什么」;本篇详细解释MFC 程序之来龙去脉,为初入MFC 领域的 读者奠定扎实的基础。说不定本篇会让你有醍醐灌顶之感。 第四篇【深入MFC 程序设计】介绍各式各样MFC 技术。「只知其然不知其所以然」 的不良副作用,在程序设计的企图进一步开展之后,愈来愈严重,最终会行不得也!那 些最困扰我们的MFC 宏、MFC 常数定义,不得一窥堂奥的MFC EXE 执行起来,并转送命令列参 数"README.TXT" 给它。 建立新进程之前,系统必须做出两个核心对象,也就是「进程对象」和「执行线程对象」。 CreateProcess 的第三个参数和第四个参数分别指定这两个核心对象的安全属性。至于第 五个参数(TRUE 或FALSE)则用来设定这些安全属性是否要被继承。关于安全属性及 其可被继承的性质,碍于本章的定位,我不打算在此介绍。 第六个参数dwCreationFlags0 码力 | 1009 页 | 11.08 MB | 1 年前3 《深入浅出MFC》2/e骨干程序。所谓骨干程序,是指Visual C++ 的工具AppWizard 所产生出来的程序代码。当然,AppWizard 会根据你的选项做出不同 的程序代码,我所据以解说的,是大众化选项下的产品。 第四篇以微软公司附于Visual C++ 光盘片上的一个范例程序Scribble 为主轴,一步一步加 上新的功能。并在其间深入介绍Runtime Type Information(RTTI)、Dynamic 验的朋友,不见得不会对本篇感到惊艳。根据我的了解,太多人使用MFC 是「只知道 这么做,不知道为什么」;本篇详细解释MFC 程序之来龙去脉,为初入MFC 领域的 读者奠定扎实的基础。说不定本篇会让你有醍醐灌顶之感。 第四篇【深入MFC 程序设计】介绍各式各样MFC 技术。「只知其然不知其所以然」 的不良副作用,在程序设计的企图进一步开展之后,愈来愈严重,最终会行不得也!那 些最困扰我们的MFC 宏、MFC 常数定义,不得一窥堂奥的MFC EXE 执行起来,并转送命令列参 数"README.TXT" 给它。 建立新进程之前,系统必须做出两个核心对象,也就是「进程对象」和「执行线程对象」。 CreateProcess 的第三个参数和第四个参数分别指定这两个核心对象的安全属性。至于第 五个参数(TRUE 或FALSE)则用来设定这些安全属性是否要被继承。关于安全属性及 其可被继承的性质,碍于本章的定位,我不打算在此介绍。 第六个参数dwCreationFlags0 码力 | 1009 页 | 11.08 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 17 由浅入深学习 map 容器insert_or_assign(key, val) 不覆盖写入,要用 m.insert({key, val}) 判断是否存在,用 m.count(key) 若存在则删除,用 m.erase(key) 第四章:迭代与遍历 物理格式 逻辑格式 面壁者罗辑监督你鞋习 ! 面壁者罗辑监督你鞋习 ! map 的元素类型是…… • set C++高性能并行编程与优化 -  课件 - 17 由浅入深学习 map 容器insert_or_assign(key, val) 不覆盖写入,要用 m.insert({key, val}) 判断是否存在,用 m.count(key) 若存在则删除,用 m.erase(key) 第四章:迭代与遍历 物理格式 逻辑格式 面壁者罗辑监督你鞋习 ! 面壁者罗辑监督你鞋习 ! map 的元素类型是…… • set- ::value_type 是 V 。 • map - ::value_type 1 == 5 × • 发现不相等,只能继续判断第二个元素是否等于 5 ? 4 == 5 × • 发现不相等,只能继续判断第三个元素是否等于 5 ? 2 == 5 × • 发现不相等,只能继续判断第四个元素是否等于 5 ? 8 == 5 × • 发现不相等,只能继续判断第五个元素是否等于 5 ? 5 == 5 √ • 发现相等,意味着我们成功找到了 5 。这时 std::find 就会返回指向第五个元素的迭代器 就是说,苦劳都是 K 的,功劳都是 V 的。就这两点区别,示意图: k k k k k k k k k k k k v v v v v v set - map - 第四章:哈希散列表 高效的查找离不开我 高效的查找离不开我 unordered_set 查找为什么高效 • 为什么哈希散列表 unorered_set 会比线性数组 vector 在查找这一点上更高效? 0 码力 | 90 页 | 8.76 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程CMAKE_CUDA_SEPARABLE_COMPILATION 选 项(设为 ON ),即可启用分离声明和定义的支持。 • 不过我还是建议把要相互调用的 __device__ 函数放在 同一个文件,这样方便编译器自动内联优化(第四课讲 过)。 两种开启方式:全局有效 or 仅针对单个程序 只对 main 这个程序启用: 对下方所有的程序启用(推荐): 顺便一提, CXX_STANDARD 和 CUDA_ARCHITECTURES cudaMemcpy ,他能够在 GPU 和 CPU 内存之间拷贝数据。 • 这里我们希望把 GPU 上的内存数据拷贝到 CPU 内存上,也就是从设备内存 (device) 到主机内存 (host) ,因此第四个参数指定为 cudaMemcpyDeviceToHost 。 • 同理,还有 cudaMemcpyHostToDevice 和 cudaMemcpyDeviceToDevice 。 cudaMemcpy 调度不对? 是编译器干的大好事! • 其实是编译器自作聪明优化了我们对 local_sum 的访 问,导致结果不对的。解决:把 local_sum 数组声明 为 volatile 禁止编译器优化(第四课介绍过)。 什么是线程组分歧( warp divergence ) • GPU 线程组( warp )中 32 个线程实际是 绑在一起执行的,就像 CPU 的 SIMD 那样。 因此如果出现分支(0 码力 | 142 页 | 13.52 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程CMAKE_CUDA_SEPARABLE_COMPILATION 选 项(设为 ON ),即可启用分离声明和定义的支持。 • 不过我还是建议把要相互调用的 __device__ 函数放在 同一个文件,这样方便编译器自动内联优化(第四课讲 过)。 两种开启方式:全局有效 or 仅针对单个程序 只对 main 这个程序启用: 对下方所有的程序启用(推荐): 顺便一提, CXX_STANDARD 和 CUDA_ARCHITECTURES cudaMemcpy ,他能够在 GPU 和 CPU 内存之间拷贝数据。 • 这里我们希望把 GPU 上的内存数据拷贝到 CPU 内存上,也就是从设备内存 (device) 到主机内存 (host) ,因此第四个参数指定为 cudaMemcpyDeviceToHost 。 • 同理,还有 cudaMemcpyHostToDevice 和 cudaMemcpyDeviceToDevice 。 cudaMemcpy 调度不对? 是编译器干的大好事! • 其实是编译器自作聪明优化了我们对 local_sum 的访 问,导致结果不对的。解决:把 local_sum 数组声明 为 volatile 禁止编译器优化(第四课介绍过)。 什么是线程组分歧( warp divergence ) • GPU 线程组( warp )中 32 个线程实际是 绑在一起执行的,就像 CPU 的 SIMD 那样。 因此如果出现分支(0 码力 | 142 页 | 13.52 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串会在字符串中查找字符 ‘ c’ ,不同的是他会从第 pos 个字符开始,例如 “ icatchthecat”.find(‘c’, 3) 会返回 4 ,因为是从 第 3 个字符 ‘ t’ 开始查找(人类看来是第四个),所以第一个 ‘ c’ 被略过。 • 如果 pos 所在的位置刚好就是 ‘ c’ ,那么会返回 pos ,例如 “ icatchthecat”.find(‘c’, 4) 会返回 4 。 会在字符串中查找字符 ‘ c’ ,不同的是他会从第 pos 个字符开始,例如 “ icatchthecat”.find(‘c’, 3) 会返回 4 ,因为是从 第 3 个字符 ‘ t’ 开始查找(人类看来是第四个),所以第一个 ‘ c’ 被略过。 • 如果 pos 所在的位置刚好就是 ‘ c’ ,那么会返回 pos ,例如 “ icatchthecat”.find(‘c’, 4) 会返回 4 。 第一次出现的位置,返回 ‘ s’ 所在位 置。 • 例如 “ hello”.find(“lo”) 会得到 3 ,因为找到的是开头的字符 ‘ l’ , 他是计算机认为的第 3 个字符(人类认为的第四个字符)。 • 同理也有 find(“str”, pos) 是从第 pos 个字符开始查找子字符串 “ str” ,例如 “ hellohello”.find(“lo”, 4) 会得到 8 ,因为0 码力 | 162 页 | 40.20 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串会在字符串中查找字符 ‘ c’ ,不同的是他会从第 pos 个字符开始,例如 “ icatchthecat”.find(‘c’, 3) 会返回 4 ,因为是从 第 3 个字符 ‘ t’ 开始查找(人类看来是第四个),所以第一个 ‘ c’ 被略过。 • 如果 pos 所在的位置刚好就是 ‘ c’ ,那么会返回 pos ,例如 “ icatchthecat”.find(‘c’, 4) 会返回 4 。 会在字符串中查找字符 ‘ c’ ,不同的是他会从第 pos 个字符开始,例如 “ icatchthecat”.find(‘c’, 3) 会返回 4 ,因为是从 第 3 个字符 ‘ t’ 开始查找(人类看来是第四个),所以第一个 ‘ c’ 被略过。 • 如果 pos 所在的位置刚好就是 ‘ c’ ,那么会返回 pos ,例如 “ icatchthecat”.find(‘c’, 4) 会返回 4 。 第一次出现的位置,返回 ‘ s’ 所在位 置。 • 例如 “ hello”.find(“lo”) 会得到 3 ,因为找到的是开头的字符 ‘ l’ , 他是计算机认为的第 3 个字符(人类认为的第四个字符)。 • 同理也有 find(“str”, pos) 是从第 pos 个字符开始查找子字符串 “ str” ,例如 “ hellohello”.find(“lo”, 4) 会得到 8 ,因为0 码力 | 162 页 | 40.20 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 11 现代 CMake 进阶指南这个包会去这个目录里搜索 Qt5Config.cmake ,更有针对性。 • 第三种 ( 推荐 ) ,直接在命令行通过 -DQt5_DIR=”xxx” 指定,这样不用修改 CMakeLists.txt 。 • 第四种,还可以通过设置环境变量 Qt5_DIR 也是可以的,就是对 Windows 用户比较困 难。 不指定 REQUIRED ,找不到时不报错,只会设置 TBB_FOUND 为 FALSE 如果没有0 码力 | 166 页 | 6.54 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 11 现代 CMake 进阶指南这个包会去这个目录里搜索 Qt5Config.cmake ,更有针对性。 • 第三种 ( 推荐 ) ,直接在命令行通过 -DQt5_DIR=”xxx” 指定,这样不用修改 CMakeLists.txt 。 • 第四种,还可以通过设置环境变量 Qt5_DIR 也是可以的,就是对 Windows 用户比较困 难。 不指定 REQUIRED ,找不到时不报错,只会设置 TBB_FOUND 为 FALSE 如果没有0 码力 | 166 页 | 6.54 MB | 1 年前3
共 5 条
- 1













