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

时间:2009-08-19 11:46:50

标签: c++ visual-studio visual-c++ compiler-construction pragma

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

#pragma optimize( "a", on )

MSDN says表示“假设没有别名”。更高版本的VS拒绝编译这个,MSDN似乎没有说明如何处理包含此#pragma的代码。

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

3 个答案:

答案 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修饰符似乎可以完成同样的工作。