欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

inline内联函数的意义

程序员文章站 2022-03-01 19:47:09
...

使用inline声明函数,表示建议编译器在编译时内联展开。

何为内联展开?类似宏一样,直接将函数在调用的位置展开


1)inline声明后编译器一定会内联展开吗?不一定
编译器会根据实际情况,如函数体大小,是否有循环、递归,函数调用是否频繁来决定。

gcc编译器一般不会对内联函数展开,只有在优化级别开到-O2时,或设置属性强制展开


2)内联函数的意义

如果一个函数很短,无循环、递归等复杂操作,且该函数经常被调用(指运行的次数多,而非调用的地址多);

那么为了减少调用的开销(保存、恢复现场),将函数声明为内联函数,可以让编译器在编译阶段将其在调用位置进行展开。


3)宏 & 内联函数
  • 宏在预处理阶段展开,内联在编译阶段展开
  • 内联函数是函数,具有参数和返回值检查,使用起来没有隐患

4)实例

#include <stdio.h>

static inline int increase(int a) {
//static inline __attribute__((always_inline)) int increase(int a) {
    return a+1;
}

int main(int argc, char const* argv[])
{
    int t = increase(4);
    printf("t = %d\n", t);
    return 0;
}

测试:使用反汇编,查看是否进行内联展开,objdump -D a.out

① gcc编译器一般不会对内联函数展开
inline内联函数的意义

② 设置函数属性__attribute__((always_inline)),强制内联展开
inline内联函数的意义

③ 优化级别开到-O2以上(请自行测试)

相关标签: C语言和数据结构