考虑这个函数:
void foo(int * p)
{
// something
}
编译器可以假设没有其他线程会修改 p 指向的值吗?或者它是否必须表现得好像这个值可以随时修改?
void bar(volatile int * p)
{
}
如果没有,volatile
关键字是否有帮助?GOTW #69声明volatile
关键字通常总是被编译器忽略。
编辑:显然对“编译器假定”这句话有一些误解。让我澄清一下:
- 如果编译器假设是这样,它可以在第一次读取时将值放入
*p
寄存器,然后使用它直到 p 超出范围。在那一刻,它应该写入*p
那个内存地址的值。 - 如果编译器不这样认为,每次
*p
读取时,编译器都应该从内存中获取它的值,因为其他线程可能会修改它。每次*p
更改,编译器都应该将其写入内存,以便其他线程可以读取它