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

Avr*_*dis 28 c++ static const volatile

我想知道volatile关键字与register,conststatic关键字的不同用途.我不确定有什么影响,所以我想:

register volatile int T=10;
Run Code Online (Sandbox Code Playgroud)

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

const volatile int T=10;
Run Code Online (Sandbox Code Playgroud)

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

static volatile int T=10;
Run Code Online (Sandbox Code Playgroud)

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

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

Alo*_*ave 33

register volatile int T=10;
Run Code Online (Sandbox Code Playgroud)

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

实际用途:

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


const volatile int T=10;
Run Code Online (Sandbox Code Playgroud)

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

实际用途:

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

static volatile int T=10;
Run Code Online (Sandbox Code Playgroud)

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

实际用途:

  • 一样volatile,除了你所需要的对象具有静态存储时间和从其他翻译单元无法访问.

  • 对于第二个,你确定你在谈论const-volatile*objects*,或const-volatile*references*(或指向const-volatile对象的指针)?因为它似乎不像const-volatile对象可以映射到硬件...... (2认同)
  • @Mehrdad:好的,这是OP引用的例子.我试图用它作为占位符进行解释,后来我添加了这些例子,所以有点想念它.无论如何,现在你指出了它,它的评论中看到那些值得看的人:) (2认同)