
本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身。
文章结尾有最新热度的文章,感兴趣的可以去看看。
文章有点长(1500字阅读时长:3分),期望您能坚持看完,并有所收获
大家好,今天我继续给大家分享干货。熟悉我的人,都知道我真正的干货一般在中间和末尾部分(文章中间部分:有项目文字和视频介绍)。请耐心看完!谢谢。您可以在文章末尾处获取完整的源代码文件。

在大型C++项目中,代码被拆分成多个库实现模块化开发与代码复用,但这也带来跨库函数调用开销大的性能问题。编译器在编译时仅能看到单个文件或库的代码,导致运行时跨库函数调用需额外开销,如函数参数传递、栈帧创建和销毁等。

以大型游戏开发项目为例,图形渲染库、物理模拟库和游戏逻辑库等之间频繁的跨库函数调用,在每一帧渲染中多次发生,积累的额外开销会导致游戏帧率下降,性能表现不佳。
现代编译器提供LTO(链接时优化)和WPO(全程序优化)功能,对应编译选项为-flto和-fwhole-program。
flto选项允许编译器在链接阶段对所有目标文件统一优化,将所有目标文件合并成单一编译单元,进行全局分析和优化,如跨文件的函数内联、常量传播等,消除跨库函数调用的不必要开销。fwhole-program选项告诉编译器将整个程序视为整体优化,与flto配合使用,可在编译阶段就对整个程序代码进行分析和优化,对跨库函数调用进行内联,减少函数调用开销。对包含多个库且存在频繁跨库函数调用的C++项目进行测试。
g++ -c -O2 -o lib1.o lib1.cpp、g++ -c -O2 -o lib2.o lib2.cpp、g++ -o my_program lib1.o lib2.o。编译器无法对跨库函数调用有效优化,生成二进制文件体积为100MB,特定测试用例下程序执行时间为1000ms。flto和fwhole-program选项,编译命令为g++ -c -flto -fwhole-program -O2 -o lib1.o lib1.cpp、g++ -c -flto -fwhole-program -O2 -o lib2.o lib2.cpp、g++ -flto -fwhole-program -o my_program lib1.o lib2.o。二进制文件体积缩小到77MB,缩小23%;相同测试用例下程序执行时间缩短到930ms,性能提升7%。启用-flto和-fwhole-program选项后,编译器全局优化使跨库函数调用内联,减少开销和冗余代码,实现二进制体积缩小和性能提升。
原文作者:讳疾忌医-note;如有侵权,请联系管理员删除。