const volatile,在C ++中注册volatile,static volatile

时间:2013-04-28 05:31:45

标签: c++ static const volatile

我想知道 volatile 关键字与注册 const static 的不同用途关键字。我不确定有什么影响,所以我想:

register volatile int T=10;

建议编译器将T存储在寄存器中,并且可以从外部某处修改T的值(OS,硬件,另一个线程)

const volatile int T=10;

程序本身不能修改T,但是T可以在代码之外的某处修改。

static volatile int T=10;

如果T是类的数据成员,则意味着类的所有对象具有相同的T值,并且可以从外部的某处修改T。如果T是文件中的全局变量,则其他文件(属于项目的一部分)中的源代码无法访问T,但可以从外部的某个位置访问T.如果T是函数中的局部变量,一旦它被初始化,它将保留在内存中直到程序结束,并且可以从外面的某个地方进行修改。

我的想法是否正确,任何有经验的C ++开发人员都可以提供一个示例,其中上述内容可能在实际应用程序中使用或者非常罕见?

1 个答案:

答案 0 :(得分:31)

register volatile int T=10;

volatile限定符意味着编译器无法对T应用优化或重新排序访问,而register是编译器的提示,T将被大量使用。如果采用T的地址,编译器将忽略该提示。请注意,register已弃用但仍在使用中。

实际用法:

我从来没有用过它从来没有感觉到它的需要,现在也无法想到它。


const volatile int T=10;

const限定符表示无法通过代码修改T。如果您尝试这样做,编译器将提供诊断。 volatile仍然与案例1中的相同。编译器无法优化或重新排序对T的访问权限。

实际用法:

  • 以只读模式访问共享内存。
  • 以只读模式访问硬件寄存器。

static volatile int T=10;

static存储限定符提供T静态存储持续时间(C ++11§3.7)和internal linkage,而volatile仍然控制优化和重新排序。

实际用法:

  • volatile相同,但您需要该对象具有静态存储持续时间且无法从其他翻译单元访问。