Pil*_*esa 6 c++ stdatomic c++20
在 C++20 中,我们可以这样写:
double x;
double x_value = std::atomic_ref(x).load();
Run Code Online (Sandbox Code Playgroud)
有没有同样效果的功能?
我试过,std::atomic_load但似乎没有非原子对象的重载。
当然,不可移植的是,有__atomic_load_n(&x, __ATOMIC_SEQ_CST) __atomic内置的GNU C 。
我很确定您在 ISO C++ 中找不到带有double *or 的函数double &。
可能需要一个std::atomic_ref<double> *or 引用,我没有检查,但我认为 的目的atomic_ref是在需要它的函数内免费构建。
如果您想要这样的函数,请编写您自己的构造 + 使用atomic_ref. 它将全部内联到__atomic_load_n编译器上,atomic无论如何都在幕后使用它。
但请确保像这样声明您的全局,以确保与atomic_ref. (我认为)将atomic_ref 指向未充分对齐的对象是UB(我认为),因此构造函数atomic_ref可以简单地假设您使用的对象与atomic<T>需要的对齐方式相同。
alignas (std::atomic_ref<double>::required_alignment) double x;
Run Code Online (Sandbox Code Playgroud)
实际上,这只会成为 8 字节基元类型的问题,例如double32 位目标上的内部结构,但struct { char c[8]; }如果您不要求对齐,那么实际上类似的东西可能不会自然对齐。
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |