C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器你所不知道的 set 容 器 by 小彭老师( @archibate ) 课件 & 代码: https://github.com/parallel101/course 上期回顾: https://www.bilibili.com/video/BV1qF411T7sd 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2. 你所不知道的 set 容器 & ,内存管理与对象生命周期 set 和 vector 的区别 • 都是能存储一连串数据的容器 。 • 区别 1 : set 会自动给其中的 元素从小到大排序,而 vector 会保持插入时的顺序。 • 区别 2 : set 会把重复的元素 去除,只保留一个,即去重。 • 区别 3 : vector 中的元素在内 存中是连续的,可以高效地按 索引随机访问, set 则不行。 • 区别 4 4 : set 中的元素可以高 效地按值查找,而 vector 则 低效。 set 的排序: string 会按“字典序”来排 • set 会从小到大排序,对 int 来 说就是数值的大小比较。那么对 字符串类型 string 要怎么排序 呢? • 其实 string 类定义了运算符重 载 < ,他会按字典序比较两个 字符串。所谓字典序就是优先比 较两者第一个字符(按 ASCII 码比较),如果相等则继续比较0 码力 | 83 页 | 10.23 MB | 1 年前3
C++23: An Overview of Almost All New and Updated FeaturesImprovements Standard Library Modules std::flat_(multi)map / std::flat_(multi)set std::mdspan std::generator basic_string(_view)::contains() Construct string(_view) From nullptr bas Improvements Standard Library Modules std::flat_(multi)map / std::flat_(multi)set std::mdspan std::generator basic_string(_view)::contains() Construct string(_view) From nullptr bas Improvements Standard Library Modules std::flat_(multi)map / std::flat_(multi)set std::mdspan std::generator basic_string(_view)::contains() Construct string(_view) From nullptr bas0 码力 | 105 页 | 759.96 KB | 6 月前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南make 、 MSBuild )称为本地构建系统( native buildsystem )。 • 负责从 CMakeLists.txt 生成本地构建系统构建规则文件的,称为生成器( generator )。 -G 选项:指定要用的生成器 • Linux 系统上的 CMake 默认用是 Unix Makefiles 生成器; Windows 系统默认是 Visual Studio 2019 ,将会添加运行时信息到可执行程序当中。这样从构建树中运行程序将很容易。为了在安装过程中忽略 掉 RPATH ,使用 CMAKE_SKIP_INSTALL_RPATH 。 • CMAKE_GENERATOR: 构建工程的产生器。它将产生构建文件 (e.g. "Unix Makefiles", "Visual Studio 2019", etc.) 一个标准的 CMakeLists.txt 模板 章:对象的属性 除了 POSITION_INDEPENDENT_CODE 还有哪些这样的属性? 另一种方式: set_target_properties 批量设置多个属性 另一种方式:通过全局的变量,让之后创建的所有对象都享有同样的属性 相当于改变了各个属性的初始默认值。 要注意此时 set(CMAKE_xxx) 必须在 add_executable 之前才有效。 如果你从百度学的 CMake ,你可能会犯如下的错误0 码力 | 166 页 | 6.54 MB | 1 年前3
Working with Asynchrony Generically: A Tour of C++ Executorsthen, when_all, sync_wait, repeat, stop_when, timeout, etc. (not all proposed yet) • A standard set of abstractions (aka, concepts) derived from the algorithms • Efficient interoperability with coroutines • A set of concepts that represent: • A handle to a compute resource (aka, scheduler) • A unit of lazy async work (aka, sender) • A completion handler (aka, receiver) • A small, initial set of generic algorithm; e.g., then. then(sender, fn) -> sender22 SHAPE OF A RECEIVER RECEIVER set_value(values... ) set_error(error ) set_done() Operation state notifies receiver by calling one of these exactly0 码力 | 121 页 | 7.73 MB | 6 月前3
C++20: An (Almost) Complete Overviewexperimental helper classes, for example: std::experimental::generator18 Coroutines Example (VC++): experimental::generator GetSequenceGenerator( int startValue, size_t numberOfValues) Spaceship Operator <=> Standard Library types include support for <=> vector, string, map, set, sub_match, … Example:53 Range-based for Loop Initializer Initializers for switch statements result in memory leaks.")]] void* GetData() { /* ... */ }80 Bit Operations Header Set of global non-member functions to operate on bits Rotate: rotl(), rotr() Counting countl_zero(): 0 码力 | 85 页 | 512.18 KB | 6 月前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理https://zhuanlan.zhihu.com/p/350136757 未来: C++20 允许函数参数为自动推断( auto ) 未来: C++20 引入协程( coroutine )和生成器( generator ) 未来: C++20 标准库加入 format 支持 跑远了! • 鉴于 C++20 还没有普遍落地(例如 CMake 不支持 C++20 modules )因此我们的课程 基于 C++17 这样就可以在编译期提前发现错误: 解决方案:要么定义 • 如果需要允许用户拷贝你的 Vector 类对象 ,我们还是需要实现一下的。 • 发现了吗?其实不管是 size/resize 这样的 get/set 模式也好;自定义的拷贝构造函数 也好; RAII 保证异常安全也好;都是在为 面向对象思想的“封装:不变性”服务。 • 即:保证任何单个操作前后,对象都是处于 正确的状态,从而避免程序读到错误数据0 码力 | 96 页 | 16.28 MB | 1 年前3
Making Libraries Consumable for Non-C++ DevelopersModel (COM) – 1993 Foreign function interface (libffi) – 1996 Simplified Wrapper and Interface Generator (SWIG) – 1996 JVM – Java Native Interface (JNI) – 1997 .NET – Platform Invoke (P/Invoke), COM interop0 码力 | 29 页 | 1.21 MB | 6 月前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器emplace , emplace_hint , try_emplace 的区别? 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2. 你所不知道的 set 容器 & 迭代器分类 (BV1m34y157wb) 3. string , string_view , const char * 的爱恨纠葛 (BV1ja411M7Di) 4. 万能的 map 容器全家桶及其妙用举例 count(key) 若存在则删除,用 m.erase(key) 第四章:迭代与遍历 物理格式 逻辑格式 面壁者罗辑监督你鞋习 ! 面壁者罗辑监督你鞋习 ! map 的元素类型是…… • set::value_type 是 V 。 • map ::value_type 是 pair 。 • 这很合理,虽然只针对 K 排序,但实际上 K 和 V 是捆绑在一起的。 k k k k k v v v v v v set map map 的元素类型是…… • pair 。 • 可是为什么要用 const K 呢?上节课说了, set 里面的 K 不能改变!一旦改变就会破坏 好不容易排好的顺序,以后再用二分法 find 就找不准了,所以 set 实际上只有 const_iterator 。 • 但是 0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南add_subdirectory 的区别 • include 相当于直接把代码粘贴过去,直接访问调用者的作用域。这里创建的变量和外面共 享,直接 set(key val) 则调用者也有 ${key} 这个变量了。 • function 中则是基于定义者所在路径,优先访问定义者的作用域。这里需要 set(key val PARENT_SCOPE) 才能修改到外面的变量。 第二章:第三方库 / 依赖项配置 用 find_package 。这样以后你每次构建任 何项目, find_package 都能自动找到这个路径的 Qt5 包了。 • (3) 单项目有效。直接在你自己项目的 CMakeLists.txt 最开头写一行(注意要加引号): • set(Qt5_DIR ”D:/Qt5.12.1/msvc2017/lib/cmake/Qt5”) # 一定要加在最前面! 举例, Linux 系统, Qt5 • 例如我把 Qt5 安装到了 /opt/Qt5 ,然后重启终端。这样以后你每次构建任何 项目, find_package 都能自动找到这个路径的 Qt5 包了。 • (3) 单项目有效。直接在你自己项目的 CMakeLists.txt 最开头写一行: • set(Qt5_DIR ”/opt/Qt5.12.1/lib/cmake/Qt5”) # 一定要加在最前面! 三种方案利弊分析 • 单次有效(通过命令行)最安全,小彭老师高度推荐。 • 全局有0 码力 | 56 页 | 6.87 MB | 1 年前3
hazard pointer synchronous reclamationfrom SRC 1 5 4 Safe to use pointer A SRC A hazard pointer is a single-writer multi-reader pointer. set HP to A if SRC == A clear HP 2 3 6 if HP != A HP Safe to delete A A 7 8 SAFE ACCESS If a hazard retirement. • Clear indicator before invoking global cleanup. • Repeat as needed if the indicator is set. • Problem: Where is user code? In User Code • Integrated link counting. • Automatically repeat global Pointer Synchronous Reclamation Beyond Concurrency TS2 – Maged Michael Cohorts Cohorts • A cohort is a set of retired objects. • A retired object can belong to at most one cohort. • The completion of a cohort’s0 码力 | 31 页 | 856.38 KB | 6 月前3
共 27 条
- 1
- 2
- 3













