作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在问题C++ volatile member functions的答案中看到了一个代码示例,演示了volatile
限定词的用法,引用如下:
volatile int x;
int DoSomething() {
x = 1;
DoSomeOtherStuff();
return x+1; // Don't just return 2 because we stored a 1 in x.
// Check to get its current value
}
volatile
限定符是否对上述代码有任何影响。
x
是一个全局变量,在对
x
进行写入和读取之间有一个函数调用,我们只读取一次
x
。编译器是否应该对
x
进行真正的读取(即使不是
volatile
)?
volatile int x;
int DoSomething() {
x = 1;
while (x != 1)
break;
}
x
之后立即重复读取
x
,因此
volatile
对于获取由其他线程编写的
x
的最新值是必需的。
volatile
的
可能用法(不是volatile的
保证用法)的有效示例。我只是想知道,如果没有
volatile
,那么假设没有多线程或内存映射IO之类的其他非琐事,是否可以保证
x
中对
DoSomeOtherStuff()
的任何可能更改都可以反射(reflect)在
return x+1
中。因为如果保证没有
volatile
就可以工作,那么该示例就显得无关紧要,更不用说一些注释指出的
volatile
的平台相关性质了。但是,如果不能保证,那么恐怕我现有的某些代码可能无法按预期工作。
最佳答案
volatile
限定词从不改变含义
代码本身。除非编译器可以证明DoSomeOtherStuff()
不会修改x
,它必须重新读取x
不管是volatile
还是否。为了使volatile
相关,x
必须类似于内存映射的IO,
可能会在程序外部更改。如果我们想像是
每微秒递增的寄存器,例如:
int
MeasureExecutionTime()
{
x = 0;
DoSomeOtherStuff();
return x;
}
DoSomeOtherStuff
中使用的时间;的
DoSomeOtherStuff
,并看到它从未修改
x
。
volatile
确实没有任何意义。
volatile
不保证您获得的最新副本
x
。可以说,这不符合
volatile
,但这是g++,Sun CC和至少某些方式
x
的指令,但是硬件
volatile
,了解
volatile
的目的是允许支持内存映射
globalPointer = new Xxx;
globalPointer
,这很重要
Xxx
的构造函数中的所有写入都变为
globalPointer
的值之前可见
globalPointer
具有
volatile
,还包括
Xxx
的所有成员,以及任何
Xxx
成员函数的变量,或任何数据
Xxx
中的指针访问。这根本不是
volatile
。即使这样,它也需要
volatile
,设置围栏或
atomic_load
和
atomic_store
原语已添加到C++ 11。
atomic_load
在上面设置指针,将导致所有先前的内存写入
atomic_read
,当然-
atomic_write
确保所有
atomic_read
确保所有后续读取
关于c++ - 在这种情况下, volatile 限定词重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21887594/
我有一个编译错误: error C3848: expression having type 'const unicode::endian_swap' would lose s
在N3421 - Making Operator Functors greater<> , std 函数对象的新特化是: template <> struct plus { template a
我找到了这个tutorial关于正则表达式,虽然我直观地理解“贪婪”、“不情愿”和“占有”限定符的作用,但我的理解似乎存在严重漏洞。 具体来说,在以下示例中: Enter your regex: .*
我是一名优秀的程序员,十分优秀!