/ Ox和/ O2编译器选项有什么区别?

Cod*_*ray 64 c++ compiler-optimization compiler-options visual-studio visual-c++

Microsoft的C++编译器(cl.exe包含在Visual Studio中)提供了几个优化开关.大多数它们之间的差异似乎是不言自明的,但我不清楚它之间的区别/O2(它优化代码以获得最大速度)和/Ox(选择"完全优化").

我试着阅读文档/Ox选项,它似乎证实,该交换机还支持优化的最高速度,而不是大小:

所述/Ox编译器选项产生在较小尺寸有利于代码的执行速度.

但特别是,"备注"部分下面的声明引起了我的注意:

通常,指定/O2(最大化速度)而不是/Ox.

所以我的问题是,为什么要一个普遍青睐/O2/Ox后一个选项是否允许已知的特定优化导致无法预料的错误或其他意外行为?是否只是获得的优化量不值得额外的编译时间?或者这只是一个完全没有意义的"推荐",因为它/O2是VS中的默认选项?

Ash*_*sha 48

我在这里找到:

Ox和O2几乎相同.它们的区别仅在于O2也会抛出GFGy.几乎没有理由避免抛出这两个开关.

  • / GF很棒 - 它将所有相同的字符串文字汇集在只读内存区域中.因此,如果您在多个代码区域中有一些文字,那么您只能在可执行文件中使用一次,从而减少图像大小.如果您的代码试图修改它,您将获得访问冲突,以防止愚蠢的错误. (14认同)
  • 值得注意的是,根据Stephan T Lavavej(MS VC ++的STL负责人)所说,[Microsoft的编译器后端团队认为/ Ox是“超越时间的邪恶开关”](https://github.com/ulfjack/ryu/pull / 70#issuecomment-412168459),并敦促所有人使用/ O2代替/ Ox。 (2认同)

Ala*_*Maw 43

Asha的回答引用了一篇关于Visual Studio 2005的博客文章,并且过时了.

最新版本的文档可在此处获得:

根据那些:

看来,/Ox设置/O2没有值,这意味着的默认值/Ox.从文档中可以看出:

/Og /Oi /Ot /Oy /Ob2为每个需要存储局部变量的函数调用激活堆栈探测器.这可能会对性能产生负面影响.

所以/O2可能实际上比/Gs /GF /Gy你慢,仅仅是因为这个.令人惊讶的IMO看起来像一个错误(在文档或实现中).

您可能还有兴趣/GF关闭堆栈周围的安全检查,这可能是一个重大的性能损失(请参阅/ GSMS文档).

您应该像往常一样对特定应用程序进