C++高性能并行编程与优化 -  课件 - 04 从汇编角度看编译器优化局部可见函数: static 因为 static 声明表示不会暴露 other 给其 他文件,而且 func 也已经内联了 other , 所以编译器干脆不定义 other 了。 inline 关键字?不需要! 编译的结果完全一致? 结论:在现代编译器的高强度优化下,加不加 inline 无所谓 编译器不是傻子,只要他看得见 other 的函数体定义,就会自动内联 内联与否和 inline 没 如果你不确定某修改是否能提升性能,那你最好实际测一下,不要脑内模拟 inline 在现代 C++ 中有其他含义,但和内联没有关系,他是一个迷惑性的名字 “ 大厂面试官”笑话 • 同样沦为笑柄的还有 register 关键字,号称:可以让一个变量使用寄存器存储,更高效。 • 都能把等差数列求和优化成 5050 的编译器笑着看着你,说道:还要你提醒吗? • 所以,如果某“面试官”试图“考考”你 register 和 inline b 没有改变。 导致优化后结果不一样,这就是 编译器放弃优化的原因。 告诉编译器别怕指针别名: __restrict 关键字 __restrict 是一个提示性的关键字,是程序员向 编译器保证:这些指针之间不会发生重叠! 从而他可以放心地优化成功: __restrict 关键字:只需加在非 const 的即可 实际上, __restrict 只需要加在所有具有写入 访问的指针(这里是 c )上,就可以优化成功0 码力 | 108 页 | 9.47 MB | 1 年前3
 谈谈MYSQL那点事也会更少,而且还会占用更少的 带宽。因此 . 在日常选择字段时必须要遵守这一规则。 应用优化 应用优化 索引建立原则(一) 索引建立原则(一)  一般针对数据分散的关键字进行建立索引,比如 一般针对数据分散的关键字进行建立索引,比如 像性别、状态值等等建立索引没有意义 像性别、状态值等等建立索引没有意义  字段唯一,最少,不可为 字段唯一,最少,不可为 null null0 码力 | 38 页 | 2.04 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 02 现代 C++ 入门:RAII 内存管理,才发展出了这些思 想,并将拷贝 / 移动 / 指针 / 可变性 / 多线程等概念作为语言基本元素存在。这些在我们的 业务里面是非常重要的,所以不可替代。 • (试图升华文章中心主旨) 扩展阅读关键字 • 限于篇幅,此处放出一些扩展知识供学有余力的同学研究: 1. P-IMPL 模式 2. 虚函数与纯虚函数 3. 拷贝如何作为虚函数 4. std::unique_ptr::release() 7. std::dynamic_pointer_cast 8. 运算符重载 9. 右值引用 && 10. std::shared_ptr和 std::any • 只提供了关键字,详细信息请善用搜索引擎: bing.com 。(不要用 baidu.com ,那个是搜广告用的) • 如果感兴趣,我可以增添一节专门讲动态多态。 回家作业! • 已经发布到: https://github 0 码力 | 96 页 | 16.28 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 08 CUDA 开启的 GPU 编程inline 在现代 C++ 中的效果是声明一个函数为 weak 符号,和性能优化意义上的内联无关。 • 优化意义上的内联指把函数体直接放到调用者那里去。 • 因此 CUDA 编译器提供了一个“私货”关键字: __inline__ 来 声明一个函数为内联。不论是 CPU 函数还是 GPU 都可以使 用,只要你用的 CUDA 编译器。 GCC 编译器相应的私货则 是 __attribute__((“inline”)) __attribute__((“inline”)) 。 • 注意声明为 __inline__ 不一定就保证内联了,如果函数太大编 译器可能会放弃内联化。因此 CUDA 还提供 __forceinline__ 这个关键字来强制一个函数为内联。 GCC 也有相应的 __attribute__((“always_inline”)) 。 • 此外,还有 __noinline__ 来禁止内联优化。 定义在 CPU 上的主机函数0 码力 | 142 页 | 13.52 MB | 1 年前3
 Await-Tree Async Rust 可观测性的灵丹妙药 -  赵梓淇2 回顾 Async Rust 的设计与痛点 1 Await-Tree 的 应用与真实案例 3 Async Rust 的优势 • 异步编程的共同优势 • async/await 关键字 • 用户态调度 • Async Rust 的独特优势 • Ownership 与 Lifetime • 无栈协程 Async Rust 回顾 Rust 的无栈协程抽象 — Future Async0 码力 | 37 页 | 8.60 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programming(*func)(int x); 则对他的调用 (*func)(42); 会得到: • mov edi, 42 • call [func] 热知识: C++ 的虚函数就是函数指针 • 通过 virtual 关键字给类定义一个虚函数,他其实就是在类成员里加了一个函数指针。 • 而在构造函数里,会把当前类重载过的虚函数,赋予给那个函数指针,实现多态。 • 虚函数是 C++ 的语法糖,纯 C 的 Linux0 码力 | 47 页 | 8.45 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程= false • 更多这类模板请搜索 c++ type traits 。 lambda 用途举例:立即求值 再也不需要烦人的 flag 变量 lambda 用途举例:局部实现递归 搜索关键字:匿名递归 恭喜!你已经基本学废了 lambda 表达式! • 总结: 1. lambda 作为参数:用 template然后 Func const & 做类型。 0 码力 | 82 页 | 12.15 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 05 C++11 开始的多线程编程size() 为 const 吗?不必, size() 在逻辑 上仍是 const 的。因此,为了让 this 为 const 时仅仅给 m_mtx 开后门,可以用 mutable 关键字修饰他,从而所有成员里 只有他不是 const 的。 为什么需要读写锁? • 刚才说过 mutex 就像厕所,同一时刻只有一个人能上。但是如果“上”有两种方式呢? • 假设在平行世界,厕所不0 码力 | 79 页 | 14.11 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 11 现代 CMake 进阶指南没加引号会怎样?会变成分号分割的列表 set(myvar hello world) 其实等价于: set(myvar “hello;world”) 如果 message 没加引号会怎样?会把列表里的字符串当成他的关键字 结论:除非确实需要列表,建议始终在你不确定的地方加上引号,例如: set(sources “main.cpp” “mylib.cpp” “C:/Program Files/a.cpp”) message(“${sources}”)0 码力 | 166 页 | 6.54 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针func(0) 是数字 0 ,而不是空指针。从而会去调用 func(int) 的那个重载。 现代 C++ 推荐用 nullptr 表示空指针 • 好在 C++11 引入了 nullptr 关键字,空指 针第一次有了语法级别的支持。 nullptr 的 类型是 std::nullptr_t ,他可以隐式转换为任 意类型的指针。 • 这样总算可以区分 func(int*) 和 func(int)0 码力 | 128 页 | 2.95 MB | 1 年前3
共 10 条
- 1
 













