Visual C++ 具有控制函数内联的 /Ob
编译器选项。对于 /Ob1
,只有标记为 inline
、 __inline
或在类声明中定义的函数被内联,而对于 /Ob2
编译器认为合适的所有函数都被内联。
我可以想象一些项目使用 /Ob1
而不是 /Ob2
对图像大小有非常严格的限制。令人惊讶的是,我们发现一个项目对图像大小没有严格限制,但它使用的是 /Ob1
,我们找不到任何原因。
为什么对可执行文件大小没有严格限制的项目更喜欢 /Ob1
而不是 /Ob2
?
最佳答案
因为更多的内联会导致更大的代码,从而导致缓存利用率较低。由于现代 CPU:s 会进行激进的分支预测,因此跳入/跳出函数不需要非常昂贵。
但是缓存的大小是有限的,因此通过内联代码强制 CPU 丢弃可能存在于缓存中的其他内容,从而增加未命中次数,从而导致 CPU 停顿。
关于c++ - 当可执行文件的大小没有严格限制时,为什么在 Visual C++ 9 中更喜欢/Ob1 而不是/Ob2?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5803767/