C++高性能并行编程与优化 -  课件 - 11 现代 CMake 进阶指南如果有多个源文件呢? 逐个添加即可 使用变量来存储 建议把头文件也加上,这样在 VS 里可以出现在“ Header Files” 一栏 使用 GLOB 自动查找当前目录下指定扩展名的文件,实现批量添加源文件 启用 CONFIGURE_DEPENDS 选项,当添加新文件时,自动更新变量 如果源码放在子文件夹里怎么办? 必须把路径名和后缀名的排列组合全部写出来吗?感觉好麻烦 大可不必!用 也可以只针对一个库,只对他启用位置无关的代码 (PIC) 第 4 章:对象的属性 除了 POSITION_INDEPENDENT_CODE 还有哪些这样的属性? 另一种方式: set_target_properties 批量设置多个属性 另一种方式:通过全局的变量,让之后创建的所有对象都享有同样的属性 相当于改变了各个属性的初始默认值。 要注意此时 set(CMAKE_xxx) 必须在 add_executable -Dmyvar=world 命令行 -D 参数太硬核了,有没有图形化的缓存编辑器? • 在 Linux 中,可以运行 ccmake -B build 来启 动基于终端的可视化缓存编辑菜单。 • 在 Windows 则可以 cmake-gui -B build 来启动 图形界面编辑各个缓存选项。 • 当然,直接用编辑器打开 build/CMakeCache.txt 修改后保存也是可以的。0 码力 | 166 页 | 6.54 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 01 学 C++ 从 CMake 学起时只会重新编译 hello.o ,而不需要把 main.o 也重新编译一遍。 2. 能够自动并行地发起对 hello.cpp 和 main.cpp 的编译,加快编译速度( make -j )。 3. 用通配符批量生成构建规则,避免针对每个 .cpp 和 .o 重复写 g++ 命令( %.o: %.cpp )。 • 但坏处也很明显: 1. make 在 Unix 类系统上是通用的,但在 Windows 则不然。 但是如果另一个文件 other.cpp 也需要用 hello 这个函数呢?也在里面声明一遍? • 如果能够只写一遍,然后自动插入到需要用 hello 的那些 .cpp 里就好了…… 头文件 - 批量插入几行代码的硬核方式 • 没错, C 语言的前辈们也想到了,他们说,既然每个 .cpp 文件的这个部分是一模一样的 ,不如我把 hello() 的声明放到单独一个文件 hello.h 里,然后在需要用到 里,然后在需要用到 hello() 这个声 明的地方,打上一个记号, #include “hello.h” 。然后用一个小程序,自动在编译前把引号 内的文件名 hello.h 的内容插入到记号所在的位置,这样不就只用编辑 hello.h 一次了嘛 ~ • 后来,这个编译前替换的步骤逐渐变成编译器的了一部分,称为预处理阶段, #define 定 义的宏也是这个阶段处理的。 • 此外,在实现的文件 hello.cpp0 码力 | 32 页 | 11.40 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 16 现代 CMake 模块化项目管理指南。 三、子项目的 CMakeLists.txt 配置 • 子项目的 CMakeLists.txt 就干净许多,只是创建了 biology 这个静态库对象,并通过 GLOB_RECRUSE 为他批量添加 了所有位于 src 和 include 下源码和头文件。 • 根项目的 CMakeLists.txt 负责处理全局有效的设定。而子 项目的 CMakeLists.txt 则仅考虑该子项目自身的设定,比 /biology/include 这个头文件搜 索路径。 五、子项目的源文件 • 这里我们给 biology 批量添加了 src/*.cpp 下的全部源码文 件。 • 明明只有 *.cpp 需要编译,为什么还添加了 include/*.h ? 为了头文件也能被纳入 VS 的项目资源浏览器,方便编辑。 • 因为子项目的 CMakeLists.txt 里指定的路径都是相对路径 ,所以这里指定 src CONFIGURE_DEPENDS src/*.cpp) • file (GLOB_RECURSE myvar CONFIGURE_DEPENDS src/*.cpp) • 疑问 1 :都是按照通配符批量匹配文件,有什么区别? • GLOB : src/main.cpp (√) src/test/main.cpp ( × ) • GLOB_RECURSE : src/main.cpp (√) src/test/main0 码力 | 56 页 | 6.87 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串len, const char *s); string &replace(size_t pos, size_t len, const char *s, size_t slen); replace 批量替换字符串 不是最高效的写法,最坏情况可达 O(mn) ,其中 m 是 “ pyb” 出现次数,如何优化?留作课后作业! 官方文档对 replace 的描述 https://en.cppreference UTF-16 来打开,那就会看到开头的文字( 0xCED2 )被显示成: • 例如微软的 Windows 在中国发售时,就会默认采用 GB18030 格式,所以有时候你会发现 Windows 上编辑好的文件,拿到 Linux (往往是 UTF-8 )的电脑上打开会变成乱码。就是 因为编码格式不匹配的原因。 • 但如果你 Windows 上写日记,只写 ASCII 字符,那么拿到 Linux 就不会有任何问题。因0 码力 | 162 页 | 40.20 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 13 C++ STL 容器全解之 vector插入的值 ); • 你可能会担心,小彭老师刚刚不是说在头部 insert 是 O(n) 复杂度嘛?那如果再重复 n 次岂不是 O(n²) 复杂度了?不 会哦, insert 的这个重载会一次性批量让 pos 之后的元素 移动 n 格,不存在反复移动 1 格的情况,最坏复杂度仍然 是 O(n) 。如果你自己写个 for 循环反复调 insert 那的确 是会 O(n²) 了,这就是为什么 的迭代器思想是,容器和算法之间的交互不是 通过容器对象本身,而是他的迭代器,因此 insert 设计 时就决心不支持直接接受 vector 作参数,而是接受他的 两个迭代器组成的区间!好处有: 1. 可以批量插入从来自另一个不同类型的容器,例如 list,只要元素类型相等,且符合迭代器规范。 2. 我可以自由选择对方容器的一个子区间(通过迭代器加 减法)内的元素来插入,而不是死板的只能全部插入。 It 可以是其他容器的迭代器类 型 • void assign(It beg, It end); vector 容器: assign 函数 • assign 还有一个重载,可以把 vector 批量填满一个特定 的值,重复的次数(长度)也是参数里指定。 • a.assign(n, val) 基本和 a = vector (n, val) 等价,唯 一的区别是后者会重新分配内存,而前者会保留原来的容 0 码力 | 90 页 | 4.93 MB | 1 年前3
 C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 这样一来,我们通用的 eatTwice 函数里 只需调用 obj->clone() ,就等价于调用了 相应的猫或是狗的 make_shared(*obj) ,这就实现了拷 贝的多态。 如何批量定义 clone 函数? • 可以定义一个宏 IOBJECT_DEFINE_CLONE ,其内容是 clone 的实现。这里我们用 std::decay_t 宏的缺点是他不遵守命名空间的规则,宏的名 字是全局可见的,不符合 C++ 的高大尚封装思 想。 • 宏: IOBJECT_DEFINE_CLONE • 高大尚 C++ 封装: zeno::IObject::clone() 如何批量定义 clone 函数? • 另一种方法是定义一个 IObjectClone 模板 类。其模板参数是他的派生类 Derived 。 • 然后在这个 IObjectClone 里实现 clone • 2. 该类的解构函数一定在 main 之后执行 • 该技巧可用于在程序退出时删除某些文件之类 。 • 这就是小彭老师的静态初始化 (static-init) 大法 。 静态初始化用于批量注册函数 • 我们可以定义一个全局的函数表(右图中的 functab ),然后利用小彭老师的静态初始化 大法,把这些函数在 main 之前就插入到全局 的函数表。 • 这样 main 里面就可以仅通过函数名从 0 码力 | 54 页 | 3.94 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 06  TBB 开启的并行编程之旅std::shared_mutex 。 https://www.zhihu.com/question/38857029 并行筛选 7 彻底避免了互斥量,完全通过预先准备好的大小,配合 atomic 递增索引批量写入。同时用小彭老师拍脑袋想到的 pod 模板类,使得 vector 的 resize 不会零初始化其中的 值。 加速比: 6.26 倍 并行筛选 8 (不推荐) 而是用 std::vector 种分治法的思想:大问题一分为二变成小 问题,分派到各个 CPU 核心上,问题足够 小时直接串行求解。 • 他也可以通过 parallel_invoke 分治来实现 : 第 9 章:流水线并行 案例:批量处理数据 注意到这里的 for (auto &dat: dats) 是可以并行的, 试试看用 tbb::parallel_for_each 替代? 简单粗暴并行 for 加速比: 3.16 倍0 码力 | 116 页 | 15.85 MB | 1 年前3
 《深入浅出MFC》2/eScribble Step2-修改使用者接口(第9章):这个版本变化了菜单,使程序多 了笔宽设定功能。由于菜单的变化,也带动了工具栏与状态列的变化。 从这个版本中我们可以学习如何使用资源编辑器,制作各式各样的程序资源。为了把 菜单命令处理函数放置在适当的类别之中,我们需要深入了解所谓的Message ■ ■ ■ ■ 第0章 你㆒定要知道(導讀) 37 Mapping 和Command Step3-增加「笔划宽度对话框」(第10 章):这个版本做出「画笔宽 度对话框」,使用者可以在其中设定细笔宽度和粗笔宽度。预设的细笔为两个 图素(pixel)宽,粗笔为五个图素宽。 从这个版本中可以学习如何以对话框编辑器设计对话框模板,以ClassWizard 增设对 话盒处理函数,以及如何以MFC 提供的DDX/DDV 机制做出对话框控制组件 (control)的内容传递与内容查核。DDX(Dialog Data 程序的几个重点: 1. 程序进入点仍为main 2. 需包含所使用之类别的头文件(本例为AFX.H) 3. 可直接使用与GUI 无关的MFC 类别(本例为CStdioFile 和CString) 4. 编辑时需指定/MT,表示使用多执行线程版本的C runtime 函数库。 第4点需要多做说明。在MFC console 程序中一定要指定多线程版的C runtime 函数库, 所以必须使用/MT 选0 码力 | 1009 页 | 11.08 MB | 1 年前3
 Hello 算法 1.0.0b4 C++版14.5. 完全背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 14.6. 编辑距离问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 14.7. 小结 . . . 动态规划 hello‑algo.com 309 14.6. 编辑距离问题 编辑距离,也被称为 Levenshtein 距离,指两个字符串之间互相转换的最小修改次数,通常用于在信息检索 和自然语言处理中度量两个序列的相似度。 � 输入两个字符串 ? 和 ? ,返回将 ? 转换为 ? 所需的最少编辑步数。 你可以在一个字符串中进行三种编辑操作:插入一个字符、删除一个字符、替换字符为任意一 个字符。 如下图所示,将 kitten 转换为 sitting 需要编辑 3 步,包括 2 次替换操作与 1 次添加操作;将 hello 转换为 algo 需要 3 步,包括 2 次替换操作和 1 次删除操作。 Figure 14‑27. 编辑距离的示例数据 编辑距离问题可以很自然地用决策树模型来解释。字符串对应树节点,一轮决策(一次编辑操作)对应树的 一条边。 如下图所示,在不限制操作的情况下0 码力 | 343 页 | 27.39 MB | 1 年前3
 Hello 算法 1.1.0 C++ 版320 14.5 完全背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 14.6 编辑距离问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 14.7 小结 . . . . return dp[amt]; } 14.6 编辑距离问题 编辑距离,也称 Levenshtein 距离,指两个字符串之间互相转换的最少修改次数,通常用于在信息检索和自 然语言处理中度量两个序列的相似度。 Question 输入两个字符串 ? 和 ? ,返回将 ? 转换为 ? 所需的最少编辑步数。 你可以在一个字符串中进行三种编辑操作:插入一个字符、删除一个字符、将字符替换为任意一个字 如图 14‑27 所示,将 kitten 转换为 sitting 需要编辑 3 步,包括 2 次替换操作与 1 次添加操作;将 hello 转 换为 algo 需要 3 步,包括 2 次替换操作和 1 次删除操作。 图 14‑27 编辑距离的示例数据 编辑距离问题可以很自然地用决策树模型来解释。字符串对应树节点,一轮决策(一次编辑操作)对应树的 一条边。 如图 14‑28 所示,在不限制操作0 码力 | 379 页 | 18.47 MB | 1 年前3
共 20 条
- 1
 - 2
 













