我正在将我的C ++代码库从Visual Studio 2k3移动到Visual Studio 2k8。代码包含
#pragma optimize( "a", on )
MSDN says表示“假设没有别名”。更高版本的VS拒绝编译这个,MSDN似乎没有说明如何处理包含此#pragma的代码。
“假设没有别名”意味着什么,以及如何决定如何处理这行代码?
答案 0 :(得分:5)
别名是指你有这样的东西:
int a[100];
int * p1 = &a[50];
int * p2 = &a[52];
现在a,p1和p2都是数组的别名或部分别名。这种情况可能会阻止编译器生成最佳的数组访问代码(FORTRAN禁止它,这就是为什么它的数组性能非常好)。
你问的pragma说编译器可以假设上述情况不存在。显然,如果你需要决定是否需要 你可以做以下两件事之一:
选择权在你手中: - )
答案 1 :(得分:2)
添加尼尔说的话:
使用pragma,您可以保证编译器不会出现别名,从而允许“标准”代码无法实现的额外优化。
要移植:删除编译指示,然后比较VC7和VC9版本的运行时间。如果VC9版本能够充分发挥作用,那么你就完成了。
否则,如果VC9版本明显变慢,请将VC7版本不带 #pragma与VC9版本进行比较。如果额外的优化是速度差异的原因,那么VC7构建现在应该减慢到VC9构建。
如果是这种情况,请查看__restrict
/ __declspec(noalias)
声明,特别是受影响的代码块中的非别名引用。使用分析器查找代码之间的差异。
否则,速度差与#pragma无关。
答案 2 :(得分:0)
MSDN将别名定义为使用引用相同内存位置的多个名称。
自VS.2005以来,VS.NET中用于控制此优化的#pragma
指令已经消失。
用于注释变量和函数的__restrict
关键字和restrict
以及noalias
__declspec
修饰符似乎可以完成同样的工作。