仅头文件库使用static inline __attribute__((always_inline))相关疑问
能否保证函数一定会被内联?
不能实现100%的绝对内联,这个修饰仅在绝大多数常规场景下强制编译器内联,存在以下例外情况:
- 编译器优化等级为
-O0(无优化)时,多数版本的GCC、Clang会忽略always_inline属性,不会强制内联函数 - 函数存在递归调用逻辑时,编译器无法将递归链路完全内联,最终还是会生成独立的函数实体
- 当函数用到编译器不支持内联的特性时,比如可变参数、被
__attribute__((noinline))显式覆盖、包含动态跳转逻辑等,该属性也会失效 - 额外注意
__attribute__((always_inline))是GCC、Clang等编译器的私有扩展,并非C/C++标准语法,在MSVC等其他编译器上不会生效,MSVC对应强制内联的语法为__forceinline。
未被使用的函数是否会出现在引入的翻译单元中?
开启优化的场景下不会保留,无优化场景下可能被保留:
- 修饰带
static关键字,说明函数为内部链接属性,仅对当前引入的翻译单元可见,不会对外导出全局符号 - 只要开启
-O1及以上优化等级,编译器默认会开启死代码消除逻辑,未被引用的static函数会被直接清除,不会出现在最终生成的.o/.obj目标文件中 - 如果使用
-O0无优化编译,部分编译器会保留未使用的static函数的符号和函数体,仅在开启链接时优化的最终链接阶段才可能被清除。
内容的提问来源于stack exchange,提问作者jestro
相关产品推荐
相关产品推荐

