如何将包含#pragma optimize("a")的代码从VC++ 7移植到VC++ 9?

sha*_*oth 1 c++ compiler-construction pragma visual-studio visual-c++

我正在将我的C++代码库从Visual Studio 2k3移动到Visual Studio 2k8.代码包含

#pragma optimize( "a", on )
Run Code Online (Sandbox Code Playgroud)

MSDN表示它意味着"假设没有别名".更高版本的VS拒绝编译这个,MSDN似乎没有说明如何处理包含此#pragma的代码.

什么"假设没有别名"意味着什么以及如何决定如何处理这行代码?

小智 5

别名是你有这样的东西:

int a[100];

int * p1 = &a[50];
int * p2 = &a[52];
Run Code Online (Sandbox Code Playgroud)

现在a,p1和p2都是数组的别名或部分别名.这种情况可能会阻止编译器生成最佳的数组访问代码(FORTRAN禁止它,这就是为什么它的数组性能非常好).

你问的pragma说,编译器可以假设上述情况不存在.显然,如果你需要决定是否需要这个,你可以做以下两件事之一:

  • 检查所有代码(很难和容易出错)
  • 关闭它,看看是否有任何性能下降(简单明了)

这是你的选择 :-)

  • 这完全是关于编译器可以在寄存器中缓存的值 - 有点像易失性问题. (2认同)
  • @sharptooth:编译器并不总是知道别名 - 例如,当a,p1和p2传递给函数时.如果没有"假设没有别名",通过p1的修改将使关于a和p2的所有缓存数据无效,需要内存读取而不是寄存器读取. (2认同)