volatile (C++)
可以使用声明的类型限定符对象在程序中修改硬件。
volatile declarator ;
备注
可以使用 /volatile 编译器开关修改编译器如何解释此关键字。
Visual Studio 基于目标结构不同的说明 volatile 关键字。对 ARM,因此,如果 /volatile 未指定编译器选项,编译器执行,就象 /volatile:iso 指定了。对除 ARM 之外的体系结构,因此,如果 /volatile 未指定编译器选项,编译器执行,就象 /volatile:ms 指定的;除了 ARM 之外的,因此,为了体系结构强烈建议您指定 /volatile:iso,然后使用显式同步基元和编译器内部,在处理在线程之间共享的内存时。
可以使用 volatile 限定符提供对使用异步过程例如中断处理程序的内存位置。
当 volatile 在同时具有 __restrict 关键字的变量时,volatile 获取优先级权。
如果 struct 成员标记为 volatile,则 volatile 传播到所有的结构。如果结构没有使用命令,在当前体系结构可以复制的一个长度,volatile 该结构可以完全丢失。
如果满足以下条件之一,volatile 关键字可能不会对字段的效果:
可变字段的长度超过使用命令,在当前体系结构可以复制的最大大小。
最外面的包含 struct的长度 (或,则可以嵌套 struct的成员) 超过使用命令,在当前体系结构可以复制的最大大小。
尽管该处理器不重新排序非缓存内存存取,必须标记为不可缓存变量转换为 volatile 确保编译器不重新排序内存存取。
已声明为 volatile 的对象不使用某些优化,因为它们的值可以随时更改。当被请求时系统始终读取不稳定对象的当前值,当请求时,即使前面的指令请求同一对象中的值。此外,立即编写该对象的值到赋值。
兼容的 ISO
如果您熟悉 C# volatile 关键字或熟悉 volatile 行为在 Visual C++ 早期版本中,请注意 C++11 ISO 标准 volatile 关键字是不同的和支持在 Visual Studio 中,当 /volatile: ISO 编译器选项指定时。默认情况下 (对于 ARM,它指定了)。在 C++11 ISO 标准代码的 volatile 关键字是为硬件访问仅使用;不要对线程间的通信使用它。对于线程间的通信,请使用结构 (例如从 C++ 标准模板库的 std::atomic<T>。
Microsoft 专用
当 /volatile:ms 编译器选项是使用按默认值时,除了 ARM 之外的体系结构目标为时编译器生成额外的代码维护排序在中对变量的对象除了维护的排序之外对其他全局对象。具体而言:
为可变对象 (也称为可变编写) 中编写与版本语义;即发生的全局变量或静态对象的引用,在对变量的对象编写在命令序列结束时将发生在已编译的二进制文件之前的该变量的写访问权。
读取可变对象 (也称为读取的变量) 具有 get 语义;即发生的全局变量或静态对象的引用,在阅读命令序列的易失存储器稍后将发生编写生成二进制文件后的该变量。
这使得可变对象能够被记忆锁使用,并且在多线程应用程序中释放。
说明 |
---|
当它依赖于提供增强的确保时,使用时 /volatile:ms 编译器选项,代码是不可移植的。 |