NoService 库
0 码力 | 1 页 | 76.00 B | 5 月前3C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器
C++ 标准库系列课 - 你所不知道的 set 容 器 by 小彭老师( @archibate ) 课件 & 代码: https://github.com/parallel101/course 上期回顾: https://www.bilibili.com/video/BV1qF411T7sd 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2. 你所不知道的 拟出来的 + n 复杂度为 O(n) 。虽然低效,但至少可 以用了。 std::next 等价于 + • 但是这样手写三个 ++ 太麻烦了 ,而且是就地操作,会改变迭代 器本身。 • 因此标准库提供了 std::next 函 数,他的内部实现相当于这样: • 没错,他会自动判断迭代器是否 支持 + 运算,如果不支持,会 改为比较低效的调用 n 次 ++ 。 std::advance 等价于 • 如果找不到,则返回 end() 迭代器。 • 刚刚说过, end() 指向的是 set 的尾部 再之后一格元素,他指向的是一个不存在 的地址,不可能有任何元素在那里!因此 end() 常被标准库用作一个标记,来表示 找不到的情况。 Python 中的 find 找不 到元素时会返回 -1 来表示,也是这个思 想。 • iterator find(int const &val) const;0 码力 | 83 页 | 10.23 MB | 1 年前3《深入浅出MFC》2/e
第二版对这些部份都有很深入的探讨,把MFC 里的一些机制直接trace code 加以说明。 xv News / BBS 论坛(CompBook and/or programming) 我想请问以下宏的意义及其使用时机和作用: DECLARE_DYNCREATE, DECLARE_DYNAMIC, IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATE, DECLA RE_MESSAGE_MAP 正是人类的本能,空出更多的脑力心力与精力,追求更新的事物。 但是,作为信息教育体系一员的我,不能不有version control。事实上我亦从来没有忘记初学 MFC 的痛苦:C++ 语言本身的技术问题是其一,MFC 庞大类别库的命名规则是其二,熟知 的Windows 程序基本动作统统不见了是其三,对象导向的观念与application framework 的 包装是其四。初学MFC programming 时,我的脑袋犹如网目过大的筛子,什么东西都留不住; 许多朋友曾经与我讨论过,对于MFC 这类application framework,应该挖掘其内部机制到什 么程度?探究源代码,岂不有违「黑盒子」初衷?但是,没有办法,他们也同意,不把那些 奇奇怪怪的宏和指令搞清楚,只能生产出玩具来。对付MFC 内部机制,态度不必像对付 MFC 类别一样;你只需好好走过那么一回,有个印象,足矣。至于庞大繁复的整个application framework 技术的0 码力 | 1009 页 | 11.08 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南
`-O3 -DNDEBUG` 3. MinSizeRel: `-Os -DNDEBUG` 4. RelWithDebInfo: `-O2 -g -DNDEBUG` • 此外,注意定义了 NDEBUG 宏会使 assert 被去除掉。 小技巧:设定一个变量的默认值 如何让 CMAKE_BUILD_TYPE 在用户没有指定的时候为 Release ,指 定的时候保持用户指定的值不变呢。 就是说 CMake gmake 。 对于 VS 7 , 它被设置为 devenv. 对于 Nmake 构建文件,它的值为 nmake 。 • CMAKE_DL_LIBS: 包含 dlopen 和 dlclose 的库的名称。 • CMAKE_COMMAND: 指向 cmake 可执行程序的全路径。 • CMAKE_CTEST_COMMAND: 指向 ctest 可执行程序的全路径。 • CMAKE_EDIT_COMMAND: 第 3 章:链接库文件 main.cpp 调用 mylib.cpp 里的 say_hello 函数 改进: mylib 作为一个静态库 改进: mylib 作为一个动态库 改进: mylib 作为一个对象库 https://www.scivision.dev/cmake-object-libraries/ 对象库类似于静态库,但不生成 .a 文件,只由 CMake 记住该库生成了哪些对象文件0 码力 | 166 页 | 6.54 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起
为什么需要库( library ) • 有时候我们会有多个可执行文件,他们之间用到的某些功能是相同的,我们想把这些共用 的功能做成一个库,方便大家一起共享。 • 库中的函数可以被可执行文件调用,也可以被其他库文件调用。 • 库文件又分为静态库文件和动态库文件。 • 其中静态库相当于直接把代码插入到生成的可执行文件中,会导致体积变大,但是只需要 一个文件即可运行。 • 而动态库则只在生成 CMake 中的静态库与动态库 • CMake 除了 add_executable 可以生成可执行文件外,还可以通过 add_library 生成库 文件。 • add_library 的语法与 add_executable 大致相同,除了他需要指定是动态库还是静态库: • add_library(test STATIC source1.cpp source2.cpp) # 生成静态库 libtest 生成动态库 libtest.so • 动态库有很多坑,特别是 Windows 环境下,初学者自己创建库时,建议使用静态库。 • 但是他人提供的库,大多是作为动态库的,我们之后会讨论如何使用他人的库。 • 创建库以后,要在某个可执行文件中使用该库,只需要: • target_link_libraries(myexec PUBLIC test) # 为 myexec 链接刚刚制作的库 libtest0 码力 | 32 页 | 11.40 MB | 1 年前3C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践
函数? • 可以定义一个宏 IOBJECT_DEFINE_CLONE ,其内容是 clone 的实现。这里我们用 std::decay_t快速获取了 this 指针所指向的类型,也就是当前所在类的类型 。 • 宏的缺点是他不遵守命名空间的规则,宏的名 字是全局可见的,不符合 C++ 的高大尚封装思 想。 • 宏: IOBJECT_DEFINE_CLONE C++ 的四大特殊函数变成了多 态的虚函数,这就是被小彭老师称为自动 虚克隆 (auto-vitrual-clone) 的大法。 Zeno 中对 OpenVDB 对象的封装 • 开源的体积数据处理库 OpenVDB 中有许多“网格”的类(可以理解为多维数组),例如: • openvdb::Vec3fGrid , FloatGrid , Vec3IGrid , IntGrid , PointsDataGrid (type-erasure) 的大法 。 类型擦除:还是以猫和狗为例 • 例如右边的猫和狗类,假设这两个类是某个第 三方库里写死的,这个第三方库的作者可能没 上过《面向对象程序设计》,居然没有定义一 个公用的 Animal 基类并设一个 speak 为虚 函数。现在你抱怨也没有用,因为这个库是按 LGPL 协议开源的,你只能链接他,不能修改 他的源码,但你的老板却要求你把 speak 变 成一个虚函数!怎么样,是不是准备好递交辞 0 码力 | 54 页 | 3.94 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
项目的文件后缀名全部改成 .cu ,都能编 译出来。 • 这是 CUDA 的一大好处, CUDA 和 C++ 的关 系就像 C++ 和 C 的关系一样,大部分都兼容 ,因此能很方便地重用 C++ 现有的任何代码库 ,引用 C++ 头文件等。 • host 代码和 device 代码写在同一个文件内,这 是 OpenCL 做不到的。 编写一段在 GPU 上运行的代码 • 定义函数 kernel ,前面加上 编译器生成 GPU 指令码。最后再链接成同一个文件 ,看起来好像只编译了一次一样,实际上你的代码会被预处理很 多次。 • 他在 GPU 编译模式下会定义 __CUDA_ARCH__ 这个宏,利用 #ifdef 判断该宏是否定义,就可以判断当前是否处于 GPU 模式 ,从而实现一个函数针对 GPU 和 CPU 生成两份源码级不同的 代码。 __CUDA_ARCH__ 是个版本号 • 其实 __CUDA_ARCH__ .h • 把他和 helper_string.h 一起拷到头文件目录里,然后改一 下 CMakeLists.txt 让他包含这个头文件目录。 • 他定义了 checkCudaErrors 这个宏,使用时只需: • checkCudaErrors(cudaDeviceSynchronize()) • 即可自动帮你检查错误代码并打印在终端,然后退出。还会 报告出错所在的行号,函数名等,很方便。0 码力 | 142 页 | 13.52 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南
就干净许多,只是创建了 biology 这个静态库对象,并通过 GLOB_RECRUSE 为他批量添加 了所有位于 src 和 include 下源码和头文件。 • 根项目的 CMakeLists.txt 负责处理全局有效的设定。而子 项目的 CMakeLists.txt 则仅考虑该子项目自身的设定,比 如他的头文件目录,要链接的库等等。 四、子项目的头文件 • 这里我们给 biology • 在声明和定义外面都套一层名字空间,例如此处我的子项目名是 biology ,那 我就 biology::Animal 。避免暴露全局的 Animal 。这是因为万一有个“不拘一 格”的第三方库也暴露个全局的 Animal ,两个符号就会发生冲突,由于类符号 都具有 weak 属性,链接器会随机选择一个覆盖掉,非常危险! • (关于符号的 weak 属性,以后单独开一门 C++ 课讲讲,这一课还是重点关注 里写一些你常用的函数,宏,变量等。 十三、你知道吗? CMake 也有 include 功能 • 和 C/C++ 的 #include 一样, CMake 也有一个 include 命令。 • 你写 include(XXX) ,则他会在 CMAKE_MODULE_PATH 这个列表 中的所有路径下查找 XXX.cmake 这个文件。 • 这样你可以在 XXX.cmake 里写一些你常用的函数,宏,变量等。0 码力 | 56 页 | 6.87 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针
个字符,因为他们是用 uint16_t 表示字符串长 度。 • 因此对于表示”长度”、”大小”的用途,可以用 size_t 这个直观的名字,他和 uintptr_t 等价 。 • size_t 是标准库大量使用的用于表示大小的类型,例如 vector::size() 返回类型就是 size_t 。 • 在主流操作系统上, size_t 和 uintptr_t 完全等价,虽然标准并没有强制要求这一点。 的但是大小相等,则结果是 unsigned 的。 • unsigned int + int = unsigned int • 只有两边都是有符号的 int 时,结果才是有符号的 int 。 浮点与标准库数学函数 浮点数的二进制表示 • float 由 4 个字节组成,也就是 32 个位。 • 最高位是符号位,接着的 8 位是指数位 (e) 。 • 剩下的 23 位是底数位 (m) 。 • 值得注意的是指数位 这个参数”的意思。 C++ 可以用更安全的 func(std::optionalpars) 来替代。 NULL 的定义为什么是这样的? • 如果你看过标准库的头文件内容,会看到 NULL 的 本质无非是一个宏。那为什么要这样定义呢? • 可见他在 C++ 中会直接定义为常数 0 ,而 C 语言 中却定义为 ((void*)0) ,为什么会区别对待? • 这是因为 C++ 规定 0 码力 | 128 页 | 2.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
,因为 cpp 字符串没要求一定是 ‘ \0’ 结尾,字符串里是可以包含 ‘ \0’ 的。 C++14 新特性:自定义字面量后缀 • 如果你 using namespace std; 其实标准库已经自动帮你定义好了 “” s 后缀。 • 这里 “ hello”s 就等价于原本繁琐的 string(“hello”) 了。 C++14 新特性:自定义字面量后缀 • 如果你觉得 using namespace 233_i32 , cpp 做得到吗? • cpp 标准委员会:谢邀,人在 cpp14 ,已经在 operator“”_i32 了。 • 其实 cpp 这种自定义挺好的,把自由度给到用户。 • 例如标准库说 “ hello”s 是 std::string ,“ hello”s 是 std::string_view 。 • 我也可以定义一个 “ hello”ms 是 mylib::String ,而且还是受 ,不会存在强迫别人接受你的那一套后缀名规范。 • 甚至可以自定义一个 class int32 具有成员函数,然后就可以快乐地 233_i32 .some_method() 了。而 rust 这种预先规定好一些后缀,就只能是他们标准库的那 个 int32 ,不能自己定义了。 • 所以 cpp 之父曾经说,他设计 cpp11 的时候,是考虑“如何在对语言本身改动最小的情况下 ,尽量只在标准库里做手脚,尽可能只利用现有的语言特性,实现0 码力 | 162 页 | 40.20 MB | 1 年前3
共 27 条
- 1
- 2
- 3