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


67

Microsoft的C ++编译器(cl.exe包括在Visual Studio中)提供了几个优化开关。它们中的大多数之间的差异似乎是不言而喻的,但是我不清楚/O2(将代码优化为最大速度)与/Ox(选择“完全优化”)之间的区别。

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

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

但特别是,“备注”部分下的以下声明引起了我的注意:

通常,请指定/O2(Maximize Speed)而不是/Ox

所以我的问题是,为什么要一个普遍青睐/O2/Ox后一个选项是否启用已知的特定优化,从而导致无法预料的错误或其他意外行为?仅仅是获得的优化数量不值得额外的编译时间吗?还是由于VS中/O2默认选项而导致的这完全是毫无意义的“推荐” ?

Answers:


46

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

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

根据那些:

您可能还对/GS-关闭堆栈周围的安全检查感兴趣,这可能会对性能造成重大影响(请参阅MS文档中的/ GS)。

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


Wrt。你带走,那/ O2可能意味着/ GS0 ......看到我的“疑惑”:stackoverflow.com/questions/42342931/...
马丁巴

/ O2在最新版本的Visual Studio中似乎并不意味着/ Gs(即/ Gs0):docs.microsoft.com/en-us/cpp/build/reference/…–
克里斯·克莱恩

49

我在这里找到它:

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


不错的工作!我想我自己搜索的时间还不够长。有趣的是,文档,使得它似乎/Ox是一个更高的优化比的水平/O2。看来这两者都将至少提供理论上的性能提升。
科迪·格雷

显然是这样。似乎将/ OPT:REF链接器选项与/ Gy一起使用将有助于从最终exe中删除未引用的函数。我不太确定/ GF有多有用。
Asha

14
/ GF非常好-将所有相同的字符串文字存储在只读内存区域中。因此,如果您在多个代码区域中都包含一些文字,那么在可执行文件中只能使用一次,这会减小图像大小。而且,如果您的代码尝试对其进行修改,则会出现访问冲突,从而防止出现愚蠢的错误。
sharptooth

2
值得注意的是,根据Stephan T Lavavej(MS VC ++的STL负责人)所说,Microsoft的编译器后端团队认为/ Ox是“超越时间的邪恶开关”,并敦促每个人都使用/ O2代替/ Ox。
克里斯·克莱恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.