我什么时候会在C++中使用const volatile、register volatible和static volati

When would I use const volatile, register volatile, static volatile in C++?

本文关键字:register volatile volatible volati static const 什么时候 C++      更新时间:2023-10-16

我想知道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++开发人员都能举一个例子,说明上面的内容可能在现实世界的应用程序中使用,或者非常罕见?

register volatile int T=10;

volatile限定符表示编译器不能对T应用优化或重新排序访问,而register则向编译器提示T将被大量使用。如果取T的地址,则编译器会简单地忽略该提示。请注意,register已弃用,但仍在使用。

实际用途:

我从来没有用过它,从来没有觉得有必要,现在真的想不出任何东西。


const volatile int T=10;

const限定符表示T不能通过代码进行修改。如果您尝试这样做,编译器将提供诊断。CCD_ 9的含义仍然与情况1中的含义相同。编译器无法优化或重新排序对T的访问。

实际用途:

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

static volatile int T=10;

static存储限定符给出了T静态存储持续时间(C++11§3.7(和内部链接,而volatile仍然控制优化和重新排序。

实际用途:

  • volatile相同,只是需要对象具有静态存储持续时间,并且不能从其他翻译单元访问