C++ | inline 内联函数是什么意思?【面试题】宏优缺点?详细讲解

内联函数

内联函数概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序的运行效率。

内联函数特性

Inline是以空间换时间;但是这里的空间注意并不是内存的空间,而是可执行程序的空间变大了;在编译阶段,会用函数体替换函数体替换函数调用。

Inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,(假如在调用一个指令很长的函数时,即使你使用了inline内联函数,但是如果这个函数超过了这个编译器的规定线时,编译器会忽略这个inline特性);

所以inline一般建议:

  1. 函数规模较小(函数不是很长,具体没有准确说法,取决于编译器的内部实现);
  2. 不是递归、且频繁调用函数
  3. 不建议声明和定义分离

为什么不建议inline内联函数声明和定义分离呢?

先需要知道的:

  • 程序翻译的过程:预处理(去注释)、编译(判断语法)、汇编(二进制目标文件)、链接(可执行程序);
  • 其中"链接"将一个项目中的许多个.o/.cpp/.h等文件进行"交互";
  • 因为".h"文件就是声明;".cpp"文件就是定义;"主要.c"就是主函数;
  • 那么在主要.c文件中要执行"某个函数"的时候,因为函数的定义并没有在这个文件中进行定义,所以就找不到"某个函数"的地址;
  • 而链接就是解决上面这个问题的;

内联函数是不会直接调用函数的,不会直接给这个函数开辟栈帧,而是会在调用内联函数的地方展开这个函数;

而此时inline被展开,就没有了函数地址了,链接就会找不到了。

面试题:宏优缺点

优点:

  1. 增强代码的复用性;
  2. 提高性能;

缺点:

  1. 不方便调试宏(因为预编译阶段进行了替换);
  2. 导致代码可读性差,可维护性差,容易误用;
  3. 没有类型安全的检查。

使用宏时容易犯错注意点:

  1. 不是函数
  2. 分号
  3. 括号控制优先级

核心点:宏是预处理阶段进行替换

相关推荐
saltymilk5 小时前
使用 C++ 模拟 ShaderLanguage 的 swizzle
c++·模板元编程
xlp666hub11 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
得物技术12 小时前
搜索 C++ 引擎回归能力建设:从自测到工程化准出|得物技术
c++·后端·测试
xlp666hub1 天前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
会员源码网1 天前
构造函数抛出异常:C++对象部分初始化的陷阱与应对策略
c++
xlp666hub1 天前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
不想写代码的星星2 天前
static 关键字:从 C 到 C++,一篇文章彻底搞懂它的“七十二变”
c++
xlp666hub2 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode
不想写代码的星星3 天前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
不想写代码的星星4 天前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++