如何将包含 #pragma optimize( "a" ) 的代码从 VC++7 移植到 VC++9?
我正在将我的 C++ 代码库从 Visual Studio 2k3 移动到 Visual Studio 2k8。 代码包含
#pragma optimize( "a", on )
MSDN 说 这意味着“假设无锯齿”。 VS 的更高版本拒绝编译这个,并且 MSDN 似乎没有说明如何处理包含这个 #pragma 的代码。
“假设没有别名”是什么意思以及如何决定如何处理这行代码?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
别名是指当你有这样的东西时:
现在 a、p1 和 p2 都是数组或其一部分的别名。 这种情况会阻止编译器生成最佳的数组访问代码(FORTRAN 禁止这样做,这就是它的数组性能如此出色的原因)。
您所询问的编译指示表示编译器可以假设上述情况不存在。 显然,如果您需要决定是否需要
您可以执行以下两件事之一:
选择是您的:-)
Aliasing is when you have stuff like this:
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:
The choice is yours :-)
添加尼尔所说的内容:
使用编译指示,您可以向编译器保证不会发生别名,从而允许进行“标准”代码不可能进行的额外优化。
移植:删除编译指示,然后比较 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.
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 andrestrict
andnoalias
__declspec
modifiers, used to annotate variables and functions, could do the same job.