C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理p 的 某个成员函数而已,并没有接过掌管对象 生命周期的大权。 解决方案 2 : unique_ptr 不能拷贝,但可以移动 • 第二种是,你的 func() 需要“夺走”资源的 占有权。比如右边这个例子, func 把指针 放到一个全局的列表里, p 的生命周期将 会变得和 objlist 一样长。因此需要接过掌 管对象生命周期的大权。 • 请根据你的具体情况,决定要选用哪一种 解决方案:提前获取原始指针 • 最简单的办法是,在移交控制权给 func 前,提前通过 p.get() 获取原始指针: 解决方案:提前获取原始指针(续) • 不过你得保证 raw_p 的存在时间不超过 p 的生命周期,否则会出现危险的空悬指 针。比如右边这样: 更智能的指针: shared_ptr • 使用起来很困难的原因,在于 unique_ptr 解决重复释放 的方式是禁止拷贝,这样虽然有效率高的优势,但导致使 放时。比如:指向窗口中上一次被点击的元素。 5. 初学者可以多用 shared_ptr 和 weak_ptr 的组合,更安全。 shared_ptr 管理的对象生命周期,取决于所有引用中,最长寿的那一个。 unique_ptr 管理的对象生命周期长度,取决于他所属的唯一一个引用的寿命 。 那是不是只要 shared_ptr 就行,不用 unique_ptr 了? • 可以适当使用减轻初学者的压力,因为他的行为和0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector存,就不必手动释放了,更安 全。 https://github.com/zenustech/zeno/blob/master/zenovis/src/Scene.cpp vector 容器:生命周期由主对象管理 • C++ 中哪个运算符是最强的?我觉得是 } • 因为 } 标志着一个语句块的结束,在这里,他 会调用所有身处其中的对象的解构函数。比如 这里的 vector ,他的解构函数会释放动态数组 都会失效。 因此如果你是在语句块内获取的 data() 指针, 语句块外就无法访问了。 • 可见 data() 指针是对 vector 的一种引用,实 际对象生命周期仍由 vector 类本身管理。 vector 容器:延续生命周期 • 如果需要在一个语句块外仍然保持 data() 对 数组的弱引用有效,可以把语句块内的 vector 对象移动到外面的一个 vector 对象 上。 变成空数组, a 指向原来 b 所包 含的元素数组,且地址不变。 • 之后即使不直接使用外面的那个临时对象 a , 也可以继续通过 data() 指针来访问数据。 vector 容器:延续生命周期 • 也可以移动到一个全局变量的 vector 对象。 • 这样数组就会一直等到 main 退出了才释放。 • 小彭老师曾经在 taichi 中就是用了一个全局 变量伺候了 unique_ptr0 码力 | 90 页 | 4.93 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 ASCII 码 第 1 章 计算机如何表达字符 https://zh.wikipedia.org/wiki/ASCII 计算机如何表达字符 • 众所周知,计算机只能处理二进制 整数,字符要怎么办呢? string_view 和 span 无非是个弱引用版本,额外增加了在头部切片的能力而 已。 强引用胖指针: string • 刚刚说的 string 容器,是掌握着字符串生命周期( lifespan )的胖指针。 • 这种掌管了所指向对象生命周期的指针称为强引用( strong reference )。 • 这个强引用的强,体现在哪里? • 当 string 容器被拷贝时,其指向的字符串也会被拷贝(深拷贝)。 string_view ,这种弱引用( weak reference )不影响原对象的生命周期,原对象的销毁仍然由强引用控制。 • 这个弱引用的弱,体现在哪里? • 当 string_view 被拷贝时,其指向的字符串仍然是同一个(浅拷贝)。 • 当 string_view 被销毁时,其指向的字符串仍存在(弱引用不影响生命周期) 。 s1 s2 “ 具体字符 串” “ 具体字符 串” 拷贝0 码力 | 162 页 | 40.20 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台发布 代码三: 代码编写 | 构建 | 部署 | 测试 | 发布 特点: ● 重复流程自动化 ● 边开发、边验证 ● 服务全生命周期而非只关注代码 ● 每天多次提交提早验证 Zadig 采用「云原生产品级交付」设计理念 数字化产研协同 • 环境 - 统一开发者协作平面 • 工作流 - 统一交付变更通道 • 异构支持 最 后 一 公 里 特色模块(一) – 发布管理 多服务编排升级 配置变更 生产观测 数据变更 灰度发布 流程自动化 特色模块(二) – 客户交付 供应商产品生命周期管理 为客户提供生命周期管理 管理不同渠道的版本 可部署到任何环境 简 化 对 客 户 的 本 地 、 私 有 云 、 离 线 环 境 的 产 品 发 布 、 许 可 和 支 持 的 管 理 产品各版本功能差异0 码力 | 59 页 | 81.43 MB | 1 年前3
Await-Tree Async Rust 可观测性的灵丹妙药 - 赵梓淇设计原理与实现 2 回顾 Async Rust 的设计与痛点 1 Await-Tree 的 应用与真实案例 3 设计目标 Await Tree 的设计原理与实现 • 追踪关键 Future 的生命周期和控制流 • Init, First Poll, Pending, Next Poll, Ready, Cancel • 实时将 Task 的执行状态维护为一棵树 • 显示目前正在阻塞 / Await-Tree 基本用例 Await Tree 的设计原理与实现 基本用例 Await Tree 的设计原理与实现 设计细节 Await Tree 的设计原理与实现 • 充分理解 Future 生命周期中的控制流 Await Tree 的维护 Await Tree 的设计原理与实现 • 初始状态 Await Tree 的维护 Await Tree 的设计原理与实现 • Future 构造0 码力 | 37 页 | 8.60 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程分离该 线程——意味着线程的生命周期不再由当 前 std::thread 对象管理,而是在线程退 出以后自动销毁自己。 • 不过这样还是会在进程退出时候自动退出 。 解构函数不再销毁线程:移动到全局线程池 • 但是 detach 的问题是进程退出时候不会 等待所有子线程执行完毕。所以另一种解 法是把 t1 对象移动到一个全局变量去, 从而延长其生命周期到 myfunc 函数体外0 码力 | 79 页 | 14.11 MB | 1 年前3
Rust 异步并发框架在移动端的应用 - 陈明煜在出口之前完 成。 Structured concurrency 结构化并发带来的好处: 更高的易用性,用户不再需要显示调用 await 提高程序的可读性和可维护性 保证了变量生命周期合法,使子任务可以捕获父任务的变量 结构化并发 Structured concurrency Scope Rust 线程中的结构化并发 阻塞等待所有 Scope 内的子线程任务完成0 码力 | 25 页 | 1.64 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人异步物理算子实现,异步 IO 数 据获取 01 可静态分发的 Trait 在不带来性 能损失的同时也提高代码组织性 02 03 强大的跨平台能力,在不同架构 下可以准确的控制代码行为 编译期间对生命周期检查确保内 存安全,无 GC 和运行时损耗 01 完善的测试类型支持,包括单元 测试、集成测试、基准测试等 02 03 和文档系统以及 CI/CD 工具的良 好集成 完整的断言系统0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程捕获的是引用,是 fac 的地 址,而 make_twice 已经返回了,导致 fac 的引用变成了内存中一块已经失效的 地址。 • 总之,如果用 [&] ,请保证 lambda 对象 的生命周期不超过他捕获的所有引用的寿 命。 作为返回值:解决问题 • 这时,我们可以用 [=] 来捕获,他会捕 获 fac 的值而不是引用。 • [=] 会给每一个引用了的变量做一份拷贝 ,放在0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 9. allocator ,内存管理与对象生命周期 set 和 vector 的区别 • 都是能存储一连串数据的容器 。 • 区别 1 : set 会自动给其中的 元素从小到大排序,而 vector 会保持插入时的顺序。 • 区别 20 码力 | 83 页 | 10.23 MB | 1 年前3
共 11 条
- 1
- 2













