Visual Studio 2013优化标志(/ O2 vs/Ox)

Cor*_*mer 7 c++ optimization performance compiler-optimization visual-studio-2013

我一直在尝试通过MSDN页面阅读各种优化标志.

我们目前的大多数项目都设置/O2为"最大化速度".

我的困惑是这究竟是什么意思.关于/O2国旗,下列哪一项陈述更接近真实?

  1. 优化速度和大小的代码,但是如果存在争用优选速度优化
  2. 针对速度优化代码,不针对大小进行优化.

我提出我们应该使用/Ox旗帜的论点,但那时我认为选项2是真的.

我基本上被告知"我们不会改变/O2,/Ox除非有人有确凿的证据证明我们需要这样做".

所以我的问题是/O2仍然执行内存优化?例如,返回值优化,复制省略等.从切换/O2/Ox

VAn*_*rei 7

正如Arkanosis指出的那样,从/ O2到/ Ox时,你禁用/ Gs,/ GF,/ Gy.问题是这些标志中的哪一个可能会提高执行速度?

/ Gs/ Gs0相同,可能会对性能产生负面影响.请参阅以下MSDN上的说明.

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

/ GF消除了重复的字符串(常量) - 称为字符串池.这将减少代码大小.较低的代码可以产生较少数量的指令高速缓存未命中但我怀疑这种效果在大多数代码上是可观察到的.

/ Gy flag将各个函数打包成COMDAT结构.这些可以用作解决方法,以避免由于同一符号的多个定义而导致的编译时错误.MSDN文档声明这只会影响构建时间,但不会影响执行时间.他们通常建议使用它.

结论:

/ Ox禁用/ Gs,/ GF,/ Gy.在某些情况下,与/ O2相比,这些选项会影响性能,几乎不会提高执行速度.当然,他们有好处,但与速度无关.

  • "而且几乎从不提高执行速度" - 这部分有点令人困惑.你的意思是"他们几乎永远不会提高执行速度"? (2认同)

Ark*_*sis 5

  • /02 是相同的 /Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy
  • /Ox 是相同的 /Og /Oi /Ot /Oy /Ob2

所以切换/O2/Ox手段:

  • /Gs(没有控件堆栈探针)
  • /GF(没有字符串池)
  • /Gy(没有功能级链接)