C++同模块非inline函数内联优化可行性及定义顺序影响问题
问题对应代码
T.hpp
class T { int _i; public: int get() const; int some_fun(); };
T.cpp
#include "T.hpp" int T::get() const { return _i; } int T::some_fun() { // noise int i = get(); // (1) // noise }
解答
- 第一个问题:开启优化的情况下,完全可以把get()调用优化为直接读_i。
现在常用的GCC、Clang、MSVC这些编译器,开了O2及以上优化等级,默认就支持同一翻译单元内的函数内联,哪怕没给函数加inline关键字也不受影响。get()本身逻辑非常简单,没有任何副作用,只要编译器优化阶段能看到它的完整实现,就会直接把调用展开,省掉函数调用的开销,效果和直接读this指针指向的_i成员完全一致。自行编译生成汇编就能验证,优化后的代码里根本找不到调用T::get的指令。 - 第二个问题:就算get定义写在some_fun后面,优化还是能生效。
单遍解析仅指编译前端做语法、语义检查的时候只扫描一遍代码,处理some_fun的前端阶段确实看不到后面才定义的get的实现,但现在的C++编译器都是前后端分离的,前端会把整个翻译单元的所有代码都解析完、收集全所有函数的定义之后,才会交给后端做优化,优化阶段根本不关心函数定义的先后顺序。只有特别古老、没有独立后端优化流程的单遍编译器才做不了这个优化,这类编译器现在基本没有实际使用场景。
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

