编译器是否可以假设没有其他线程会修改参数?

qdi*_*dii 3 c++ optimization volatile

考虑这个功能:

void foo(int * p)
{
   // something
}
Run Code Online (Sandbox Code Playgroud)

编译器是否可以假设没有其他线程会修改p指向的值?或者它是否必须表现得好像可以随时修改此值?

void bar(volatile int * p)
{
}
Run Code Online (Sandbox Code Playgroud)

如果没有,volatile关键字是否有帮助?GOTW#69指出,volatile编译器通常会忽略关键字.

编辑:显然对"编译器假定"这一短语存在一些误解.让我澄清一下:

  • 如果编译器假设,它可以*p在第一次读取时将值放入寄存器,然后使用它直到p超出范围.此时,它应该写入该*p内存地址的值.
  • 如果编译器不这样假设,那么每次*p读取时,编译器都应该从内存中获取它的值,因为有一些其他线程可能会修改它.每次*p更改时,编译器都应将其写入内存,以便其他线程可以读取它

rya*_*an0 5

编译器不能做出这个假设,程序员也不能.仅使用volatile关键字不能防止并发访问.

  • 我会说编译的*会做出这样的假设,即它就像没有并发访问一样. (3认同)