我何时使用const volatile,在C ++中注册volatile,静态volatile?

问题描述 投票:27回答:1

我想知道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 ++开发人员都可以举一个示例,说明上述示例可以在实际应用中使用,还是很少见?

c++ static const volatile
1个回答
32
投票
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相同,不同之处在于您需要对象具有静态存储期限,并且无法从其他翻译单元访问。
© www.soinside.com 2019 - 2024. All rights reserved.