0%

写在前面

参考链接 https://www.youtube.com/watch?v=bpF1LKQBgBQ

这篇演讲有关 C++ 中的 trivial 概念。并且提到当对象 trivially copyable 时,参数传递和返回值都会变得更容易优化。

返回值优化

第 2 段代码在 C++20 之前不能被优化是因为结构化绑定的分量是结构体的一部分,作为返回值时不能被直接建在调用者的栈上。

Trivial 的概念

Note

有虚函数或者虚基类(也就是需要 vptr),就不满足平凡构造/赋值/拷贝了。如果没有给出析构函数,还是可以平凡析构的。

视频链接 https://www.youtube.com/watch?v=SVEYNEWZLo4

不要用 Volatile 来同步

Note

顺带一提:C++20 中,有不少和 volatile 相关的操作都已经被标记为过时。详见 https://en.cppreference.com/w/cpp/language/cv

#include <tuple>

int main() {
  volatile int x = 0;
  //! C++20
  //! 1.1 函数参数不能用 volatile 类型
  // auto f1 = [](volatile int) {};
  //! 1.2 函数返回值不能 volatile 类型
  // auto f2 = []() -> volatile int { return 0; };
  // int y = (x = 6);
  //! 2 自增、自减运算符不能在 volatile 变量上操作
  // x++;
  //! 3. 结构化绑定不能用 volatile
  // auto volatile [a, b] = std::tuple{1, 3};
  //! 4. 不能基于 volatile 变量连续赋值,除非是在不评估的环境中
  //! 错误
  // int z = (x = 5);
  //! 会有 -Wunevaluated-expression 警告,正确但是不推荐
  using T = decltype((x = 5));
}

可以用来同步的机制:

  1. 汇编级别的内存屏障指令(见下方图片)
  2. 原子变量和锁

https://youtu.be/lNPZV9Iqo3U?si=lS1hf2ND4SS-6ELB by Daniel Anderson

幻灯片链接: https://raw.githubusercontent.com/CppCon/CppCon2023/main/Presentations/lock_free_atomic_shared_ptr_cppcon2023.pptx

共享指针是线程安全的吗?

std::shared_ptr 的控制块是线程安全的(其实也就是析构是线程安全的, https://en.cppreference.com/w/cpp/memory/shared_ptr/atomic2 中有 “Note that the control block of a shared_ptr is thread-safe…” 这句话),但是:

  1. 对它指向的对象的访问不是线程安全的。
  2. 对它本身的读写不是线程安全的。

这个 lecture 主要考虑第 2 点。