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