2026/4/18 12:10:39
网站建设
项目流程
做课件好用的网站,wordpress采集规则,html网页框架代码实例,营销qq多少钱一个月一、什么是 inline 函数#xff1f;#xff08;what#xff09;inline 的本意#xff1a;把函数调用“展开”成函数体本身#xff0c;用来减少函数调用的开销。普通函数int add(int a, int b) {return a b;
}int x add(1, 2); // 有一次函数调用inline 函数inline int …一、什么是inline函数whatinline的本意把函数调用“展开”成函数体本身用来减少函数调用的开销。普通函数int add(int a, int b) { return a b; } int x add(1, 2); // 有一次函数调用inline 函数inline int add(int a, int b) { return a b; } int x add(1, 2);编译器可能会变成类似int x 1 2; // 直接展开二、为什么要用 inline(why)1、 函数调用本身有开销压栈、传参、跳转、返回。函数被频繁调用不断地有函数入栈即函数栈会造成栈空间或栈内存的大量消耗。为了解决这个问题特别的引入了inline修饰符表示为内联函数2、 所以对于很短、调用频繁的函数inline可以提高效率。三、inline是“建议”不是命令inline int f() { ... }并不保证一定内联编译器会自己决定函数太大 ❌、有递归 ❌、有复杂控制流 ❌inline只是告诉编译器我希望你内联四、inline ≠ 一定快1、内联是以代码膨胀复制为代价仅仅省去了函数调用的开销从而提高函数的执行效率有时候反而更慢因为内联会导致代码膨胀、指令缓存压力变大2、所以inline 适合“短小、频繁”的函数五、inline 的一个重要作用容易忽略解决头文件重复定义问题ODR// header.h inline int add(int a, int b) { return a b; }头文件中的这个函数可以被多个.cpp包含在链接时不会产生“重复定义”错误这点在头文件函数定义中非常重要inline在这里更像“链接层面的语义”六、类内定义的成员函数默认就是 inlineclass A { public: int f() { return 1; } // 默认 inline };等价于inline int f() { return 1; }七、总结1、inline 希望把函数调用变成代码展开2、提高小函数性能3、是建议不是强制4、头文件中定义函数常用5、类内函数默认 inline补充对于 五、inline的重要作用中解决头文件重复定义问题ODR进行详细说明ODROne Definition Rule一、要弄清楚这一点需要先搞清楚为什么会 出现头文件“重复定义”的问题举个例子header.hint add(int a, int b) { return a b; }a.cpp#include header.hb.cpp:#include header.h当开始编译时 会发现a.cpp 编译 → 里面有一个add的函数定义b.cpp 编译 → 里面也有一个add的函数定义链接阶段 就会报错因为链接器看到“同一个函数add你给了我两个定义”这就违反了ODROne Definition Rule唯一性定义规则于是报错multiple definition ofadd二、现在知道什么是头文件“重复定义”的问题了那inline函数是怎么解决这个头文件重复的问题的为什么它就可以解决呢1、是怎么解决的经过改变添加了inline函数过后header.hinline int add(int a, int b) { return a b; }关键变化重点inline 告诉编译器这个函数允许在多个 cpp 中出现定义只要这些定义 一模一样就不算违反 ODR也就是说a.cpp 里有一个 inline addb.cpp 里也有一个 inline add✅ 合法2、为什么inline可以因为内联函数本来就可能被展开add(1, 2)可能直接变成1 2那每个.cpp自己“知道”函数内容是合理的不需要全程序只有一个实体所以标准就允许inline 函数在多个翻译单元中定义3、和static的区别static函数头文件中static int add(int a, int b) { return a b; }每个.cpp各有一份独立函数互相完全没关系不会冲突inline函数inline int add(int a, int b) { return a b; }看起来有多份逻辑上是同一个函数链接器允许它们共存4、总结头文件中定义函数要么inline、static、放进 class 里默认 inline否则就很容易 链接错误简单来说inline不只是“优化用”它还告诉链接器这个函数允许在多个 cpp 中定义不算重复。