在 c++ 中,void* volatile* 的含义是什么?

What is the meaning of void* volatile* in c++

本文关键字:是什么 volatile void c++      更新时间:2023-10-16

我正在查看以下代码:

inline void* interlocked_read_acquire(void* volatile* x);

我想知道为什么不只是一个volatile void*作为论据。一般来说,volatile*的语义或定义是什么?我还假设您可以将 volatile* 限定符与除 void 之外的任何其他类型一起使用。这是对的吗?

使用 cdecl 或顺时针螺旋规则来破译 C 样式的声明:

void* volatile* x
  • 将 x 声明为指向 void 的可变指针的指针

这与

volatile void* x
  • 将 x 声明为指向易失性 void 的指针

想知道为什么 [ void* volatile* 和 ] 不仅仅是一个volatile void*...?

它们是不同的东西。

  • void* volatile* 是指向易失性 ( void*) 的指针(因此无需强制转换即可取消引用和访问volatile void*,但只会为您提供内存中一些尚未指定的东西的地址)

  • volatile void* 是指向易失性void的指针(因此在取消引用之前必须强制转换为类似 volatile int*volatile My_Class* 的类型)

void * ptr1;表示ptr1是一个类型为void *的变量。此类型表示"通用指针" - 它指向某个内存位置,但不包含该位置中的内容的类型信息。

void * volatile ptr2; 表示变量 ptr2 也是一个泛型指针,但ptr2也是volatile 。关键字 volatile 称为 cv 限定符,它具有与 const 相同的语法规则。

易失变量的含义是,当其他代码说ptr2时,编译器无法优化它;它必须读取或写入存储ptr2的内存位置;它必须允许某些外部进程也在读取或写入该位置的可能性。

最后,void * volatile *x是可以指向ptr2的东西。 例如,我们可以有 void * volatile * x = &ptr2; .例如,如果我们编写*x = NULL;,那么*x具有类型 void * volatile 与我们刚刚查看的 ptr2 具有相同的含义。

如果您省略了限定符,编译器会抱怨,例如 void * *y = &ptr2; .这是因为表达式*y将具有类型 void *(非易失性),因此编译器可能会围绕它执行优化,但这是不正确的行为,因为ptr2不允许这些优化。 (你可能会认识到"易失性正确性"与恒常正确性是一回事)。

volatile 是一个附加属性,你可以先删除它从中读取

void* volatile* x

自:

void* *x

这是非常熟悉的。例如,一个错误标记的内存指针数组。而且您不会与

volatile void*

减少到

void* x.