在 c++ 中,void* volatile* 的含义是什么?
What is the meaning of void* volatile* in c++
我正在查看以下代码:
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.
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 什么是类型*volatile*name=value
- 在中断例程中使用C++对象(和volatile)的正确方法是什么
- 在 c++ 中,void* volatile* 的含义是什么?