在下面的C++程序中:
struct O
{
const int id;
};
extern void externalFunc();
int func(O* o)
{
//first load of o->id happens here:
int first = o->id;
externalFunc();
//second load happens here, but why?
return o->id + first;
}
无论是Clang还是MSVC,启用所有优化选项编译此代码时,o->id值会以一种方式从内存中加载两次。
为什么这些编译器无法删除第二个加载?我试图通过将id成员标记为const来告诉编译器该值保证不会更改,但显然两个编译器都没有找到足够的保证。如果我去掉对externalFunc()的调用,它们会优化掉第二个加载。我如何说服编译器这个值真的不会改变?
externalFunc
可以在指向o
的内存中摧毁并重新创建O
对象。 - Igor Tandetnikfunc()
接受了一个const O & o
或者一个const O * const o
,会发生什么? - Christian Severin*o
在func
函数下的变化演示:http://rextester.com/TISOA68957 - Igor Tandetnikint func(O* __restrict o) {
- jxh