如何将C++模板函数设为noinline或强制其在perf分析结果中显示
性能分析场景下关闭函数内联、修复perf符号显示的方案
一、全局禁用所有函数内联(无需修改源码)
你不需要逐个给函数加noinline标记,直接通过编译选项全局关闭内联即可,模板函数也会生效:
- GCC/Clang编译器下直接添加
-fno-inline编译选项,即可关闭所有函数的内联优化,覆盖普通函数、模板函数、隐式自动内联的小函数等所有场景。 - CMake项目的配置方法:
如果你要对整个项目生效,直接在顶层CMakeLists.txt中添加:
如果你仅要对特定的可执行文件/库目标生效,改为对指定目标添加配置即可:add_compile_options(-fno-inline -g3)
额外添加的target_compile_options(你的目标名称 PRIVATE -fno-inline -g3)-g3选项会输出更高等级的调试信息,包含模板、宏相关的符号定义,能解决大部分模板函数不显示名称的问题。
二、修复perf仅显示地址无符号的问题
除了内联因素外,按照以下操作可以确保perf正常解析符号:
- 执行perf命令时建议加sudo权限,Ubuntu默认的
perf_event_paranoid内核参数会限制普通用户读取符号和调用栈信息,你也可以临时调整参数避免每次加sudo:echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid - 记录性能数据时添加
-g参数抓取调用栈信息,示例命令:sudo perf record -g ./你的可执行文件 - 生成分析报告时如果还是出现符号缺失,可以添加
--no-ip参数跳过无效地址解析:perf report --no-ip
三、补充说明
C的模板函数本身是支持noinline标记的,GCC/Clang下可以用__attribute__((noinline))或者C11标准的[[gnu::noinline]]标记单个模板函数,全局关闭内联的方案已经覆盖模板函数场景,不需要修改业务代码,分析完成后去掉编译选项即可恢复正常构建的优化等级。
内容的提问来源于stack exchange,提问作者Serge Rogatch
相关产品推荐
相关产品推荐

