C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 IObject 一切对象的公共基类。 • INode 一切节点的公共基类。 多态的经典案例 • IObject 具有一个 eatFood 纯虚函数,而 CatObject 和 DogObject 继承自 IObject ,他 们实现了 eatFood 这个虚函数,实现了多态。 • 注意这里解构函数( ~IObject )也需要是虚函数 ,否则以 IObject * 存储的指针在 delete struct Derived : Base> {}; CRTP 的改进:如果基类还想基于另一个类 • 现在我们的需求有变,需要新增一个“超狗 (superdog)” 类,他继承自普通狗 (dog) 。 • 这时我们可以给 IObjectClone 新增一个模板参数 Base ,其默认值为 IObject 。 • 这样当用户需要的时候就 • 可指定第二个参数 Base Vec3IGrid , IntGrid , PointsDataGrid • 我们并不知道他们之间的继承关系,可能有也可能没有。但是在 Zeno 中,我们必须有。 • 他们还有一些成员函数,这些函数可能是虚函数,也可能不是。 • 如何在不知道 OpenVDB 每个类具体继承关系的情况下,实现我们想要的继承关系,从而 实现封装和代码重用?简单,只需用一种被小彭老师称为类型擦除 (type-erasure) 0 码力 | 54 页 | 3.94 MB | 1 年前3
Rust 异步并发框架在移动端的应用 - 陈明煜Scope 外的变 量 AsyncScope 将 std 库中 thread scope 的思想异步化 在同步环境阻塞等待子异步任务完成,在异步 环境异步等待子异步任务完成 优先级继承:子任务默认继承父任务优先级, 也可使用 detached 模式指定其他优先级 任务取消:取消父任务,也将取消所有子任务 性能 Performance 耗时 ( 单位 us) Tokio ylong0 码力 | 25 页 | 1.64 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战CUDA 表面对象:封装 • 要访问一个多维数组,必须先创建一个表面对象 ( cudaSurfaceObject_t )。 • 考虑到多维数组始终是需要通过表面对象来访问的,这 里我们让表面对象继承自多维数组。 • 在核函数中可以用 surf3Dread 和 surf3Dwrite 来读写 表面对象中的元素, x,y,z 参数指定要访问元素的坐标 ,要注意 x 必须乘以 sizeof( 元素类型0 码力 | 58 页 | 14.90 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人. 董监高 / 就职 / 实际控制人 拥有 / 抵押 / 质 押 股权 / 资管计划 / 资金往来 / 担 保 / 借贷 / 集团 / 控股 / 上下 游 ... 父子 / 组合 / 继承 转账 / 大额转账 / 频繁转 账 /... 拥有 拥有 持有 登录 / 连接 已购买 / 意向购 买 / 潜在购买 /... 个人 客户 账户 机构 客户 资产 合约 员工0 码力 | 38 页 | 24.68 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程比如,利用重载实现“将一个数乘以 2” 这个 功能,需要: 为什么面向对象在 HPC 不如函数式和元编程香了? 这个例子要是按传统的面向对象思想,可能是这样: 令 Int, Float, Double 继承 Numeric 接口类并实现 ,其中 multiply(int) 作为虚函数。然后定义: Numeric *twice(Numeric *t) { return t->multiply(2); }0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串_Alloc_hider )的大小也是 n ,不会变成 n + 1 。 • 所以这就是为什么 GCC 标准库把成员变量 _M_p 挪到了一个 _Alloc_hider 里,而 让 _Alloc_hider 又继承 allocator 。就是为了在 allocator 为空类的时候(无状态分 配器),能让 allocator 不必占据额外的空间。 • 问题:既然 allocator 往往都是个空类( std::allocator0 码力 | 162 页 | 40.20 MB | 1 年前3
共 6 条
- 1













