c++访问权限

c++ access_once

本文关键字:权限 访问权 访问 c++      更新时间:2023-10-16

我正在尝试在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中的任何东西。

将宏更改为:

#define ACCESS_ONCE(x) (*static_cast<std::remove_reference<decltype(x)>::type volatile *>(&(x)))

取消引用指针会导致引用。宏正在尝试将其强制转换为void *& volatile,而不是您想要的void * volatile。不能将volatile限定符应用于引用类型,因此必须使用std::remove_reference将其更改为普通的非引用类型。