1

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

#pragma optimize( "a", on )

MSDN 说这意味着“假设没有别名”。更高版本的 VS 拒绝编译它,而且 MSDN 似乎没有说明如何处理包含此 #pragma 的代码。

“假设没有别名”是什么意思,我如何决定如何处理这行代码?

4

3 回答 3

5

别名是当你有这样的东西时:

int a[100];

int * p1 = &a[50];
int * p2 = &a[52];

现在 a、p1 和 p2 都是数组的别名,或者它的一部分。这种情况会阻止编译器生成最佳的数组访问代码(FORTRAN 禁止它,这就是它在数组性能方面如此出色的原因)。

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

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

这是你的选择 :-)

于 2009-08-19T11:51:55.463 回答
2

补充尼尔所说的:

使用编译指示,您可以向编译器保证不会发生别名,从而允许“标准”代码无法进行的附加优化。

移植:删除编译指示,然后比较 VC7 和 VC9 构建的运行时间。如果 VC9 构建运行良好,那么您就完成了。

否则,如果 VC9 构建速度明显较慢,请将不带#pragma 的 VC7 构建与 VC9 构建进行比较。如果额外的优化是速度差异的原因,那么现在应该将 VC7 构建放慢到 VC9 构建。

如果是这种情况,请查看__restrict/__declspec(noalias)声明,特别是受影响代码块中的非别名引用。使用分析器查找代码之间的差异。

否则,速度差异与#pragma 无关。

于 2009-08-19T12:30:20.600 回答
0

MSDN将别名定义为使用引用同一内存位置的多个名称。

#pragma自 VS.2005 以来,用于控制 VS.NET 中这种优化的指令已经消失。

用于注释变量和函数的__restrict关键字和restrict修饰符似乎可以做同样的工作。noalias __declspec

于 2009-08-19T12:12:13.053 回答