33

我想知道volatile关键字与registerconststatic关键字的不同用途。我不确定有什么影响,所以我认为:

register volatile int T=10;

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

const volatile int T=10;

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

static volatile int T=10;

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

我的想法是否正确,任何有经验的 C++ 开发人员都可以举一个例子,说明上述内容可能用于实际应用程序还是非常罕见?

4

1 回答 1

37
register volatile int T=10;

volatile限定符意味着编译器不能对 进行优化或重新排序访问T, While是对将被大量使用register的编译器的提示。T如果使用了地址,T编译器会简单地忽略该提示。请注意,register已弃用但仍在使用。

实际用法:

我从来没有使用过它,从来没有觉得需要它,现在也想不出任何东西。


const volatile int T=10;

constqualifier 表示T不能通过代码修改。如果您尝试这样做,编译器将提供诊断。volatile仍然意味着与案例 1 相同。编译器无法优化或重新排序对T.

实际用法:

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

static volatile int T=10;

staticstorage 限定符提供T静态存储持续时间(C++11 §3.7)和内部链接,同时volatile仍然控制优化和重新排序。

实际用法:

  • volatile除了您需要对象具有静态存储持续时间并且无法从其他翻译单元访问之外,其他相同。
于 2013-04-28T05:47:15.640 回答