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

问题描述 投票:0回答:3

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

#pragma optimize( "a", on )

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

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

c++ visual-studio visual-c++ pragma
3个回答
5
投票

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

int a[100];

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

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

您所询问的编译指示表示编译器可以假设上述情况不存在。显然,如果您需要决定是否需要 您可以执行以下两件事之一:

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

选择是你的:-)


2
投票

补充尼尔所说的话:

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

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

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

如果是这种情况,请查看

__restrict
/
__declspec(noalias)
声明,特别是受影响代码块中的非别名引用。使用探查器查找代码之间的差异。

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


0
投票

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

用于在 VS.NET 中控制此优化的

#pragma
指令自 VS.2005 以来已消失。

似乎用于注释变量和函数的

__restrict
关键字和
restrict
noalias
__declspec
修饰符可以完成相同的工作。

© www.soinside.com 2019 - 2024. All rights reserved.