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/

10-09 17:15