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

发布于 2024-08-02 03:05:58 字数 345 浏览 9 评论 0 原文

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

#pragma optimize( "a", on )

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

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

I'm moving my C++ codebase from Visual Studio 2k3 to Visual Studio 2k8. Code contains

#pragma optimize( "a", on )

MSDN says that it means "assume no aliasing". Later versions of VS refuse to compile this and MSDN doesn't seem to say what to do with code containing this #pragma.

What does "assume no aliasing" mean and how to I make a decision on what to do with this line of code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

流年已逝 2024-08-09 03:05:59

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

int a[100];

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

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

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

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

选择是您的:-)

Aliasing is when you have stuff like this:

int a[100];

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

Now a, p1 and p2 are all aliases for the array, or parts of it. This situation can prevent the compiler from producing optimal array access code (FORTRAN forbids it, which is why it is so good with array performance).

The pragma you are asking about says that the compiler can assume the above situation doesn't exist. Obviously, if you need to decide whether you need
this you can do one of two things:

  • check all your code (difficult and error prone)
  • turn it off and see if there is any performance degradations (easy and sensible)

The choice is yours :-)

爱你是孤单的心事 2024-08-09 03:05:59

添加尼尔所说的内容:

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

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

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

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

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

Adding to what Neil said:

With the pragma you make a guarantee to the compiler that aliasing does nto occur, allowing additonal optimizations that are not possible for "standard" code.

To port: remove the pragma, then compare the run time of the VC7 and the VC9 build. If the VC9 build performs adequately, you are done.

Otherwise, if the VC9 build is significantly slower, compare the VC7 build without the #pragma to the VC9 build. If the additional optimizations are the cause of the speed difference, the VC7 build should now be slowed down to the VC9 build.

If that's the case, look into the __restrict / __declspec(noalias) declarations, and specifically the non-aliased references in the affected code block. Use a profiler to find the differences between the code.

Otherwise, the speed difference is not related to the #pragma.

扶醉桌前 2024-08-09 03:05:59

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

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

似乎 __restrict< /a> 关键字和 限制 noalias __declspec 修饰符,用于注释变量和函数,可以完成相同的工作。

MSDN define the aliasing as the use of multiple names that refer to the same memory location.

The #pragma directive used to control this optimization in VS.NET has disappeared since VS.2005.

It seems that the __restrict keyword and restrict and noalias __declspec modifiers, used to annotate variables and functions, could do the same job.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文