我正在将 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 构建速度明显较慢,请将 without #pragma 的 VC7 构建与 VC9 构建进行比较。如果额外的优化是速度差异的原因,则 VC7 构建现在应该减慢为 VC9 构建。
如果是这种情况,请查看
__restrict
/ __declspec(noalias)
声明,特别是受影响代码块中的非别名引用。使用探查器查找代码之间的差异。
否则,速度差异与#pragma无关。
MSDN 将别名定义为使用引用同一内存位置的多个名称。
用于在 VS.NET 中控制此优化的
#pragma
指令自 VS.2005 以来已消失。
__restrict
关键字和 restrict
和 noalias
__declspec
修饰符可以完成相同的工作。