gpt4 book ai didi

C++ access_once

转载 作者:太空狗 更新时间:2023-10-29 23:33:36 26 4
gpt4 key购买 nike

我正在尝试在 C++11 中实现 Linux 宏 ACCESS_ONCE 的等价物。ACCESS_ONCE(x) 获取 x 的地址,转换为指向与 x 相同类型的 volatile 的指针,然后取消引用它。这会强制编译器不通过此宏优化对 x 的访问(并使访问仅在此处发生一次)。

我在 c++11 中尝试这样做涉及 decltype:

#define ACCESS_ONCE(x) (*static_cast<decltype(x) volatile *>(&(x)))

这适用于大多数情况,但我曾经这样使用过一次:

void foo(void **bar) {
while (ACCESS_ONCE(*bar) != NULL)
;
}

这失败并出现错误:

'volatile' qualifiers cannot be applied to 'void*&'

我做错了什么?

最佳答案

template<typename T>
inline T volatile &access_once(T &t) {
return static_cast<T volatile &>(t);
}

这避免了宏,更简单,因为类型推导和引用删除隐含在模板签名中,并且它避免了冗余的地址和引用运算符(引用类型之间的静态转换被定义为做与获取地址相同的事情, 强制转换然后取消引用)。它的性能同样出色,我认为它不依赖于 C++11 中的任何内容。

关于C++ access_once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12393562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com