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

微软的C ++编译器(包含在Visual Studio中的cl.exe )提供了几个优化开关 。 大多数的区别似乎是不言自明的,但是我不清楚/O2 (哪个优化代码为最大速度)和/Ox (哪个select“全优化”)之间的区别。

我已经尝试阅读/Ox选项的文档 ,并且似乎证实了这个开关还能够优化最大速度,而不是大小:

/Ox编译器选项产生的代码优先于较小的执行速度。

但是,特别是“备注”部分下面的陈述引起了我的注意:

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

所以我的问题是, 为什么一个人应该普遍支持/O2 /Ox 后面的选项是否使已知的特定优化导致不可预见的错误或其他意外的行为? 简单地说,获得的优化量不值得额外的编译时间吗? 或者,这只是一个完全没有意义的“推荐”,因为/O2是VS中的默认选项?

Asha的回答引用了关于Visual Studio 2005的博客文章,而且已经过时了。

最新版本的文档可以在这里find:

  • /Ox : https : //msdn.microsoft.com/en-us/library/59a3b321.aspx
  • /O2 : https : //msdn.microsoft.com/en-us/library/8f8h5cxt.aspx

根据那些:

  • /Ox/Og /Oi /Ot /Oy /Ob2
  • /O2 →相同,但进一步增加/Gs /GF /Gy

    • /Gs 控制堆栈检查调用
    • /GF 消除重复的string
    • /Gy做function级别的链接

看起来/O2设置/Gs没有值,这意味着默认值/Gs0 。 从这个文档:

/Gs0为每个需要存储本地variables的函数调用激活堆栈探测。 这可能会对性能产生负面影响。

所以/O2对你来说实际上可能会比/Ox慢,仅此而已。 海事组织是令人惊讶的,看起来像一个错误(无论是在文档或实施)。

您可能还有兴趣在/GS-closures堆栈周围的安全检查,这可能是一个重大的性能影响(请参阅MS文档/ GS )。

您应该像以往一样对您的特定应用程序进行基准testing

我在这里find了 :

牛和O2几乎是相同的。 他们只是在O2也抛出GF和Gy的事实上有所不同。 几乎没有理由避免投掷这两个开关。