参考:https://blog.csdn.net/weixin_45031801/article/details/141035506

一、什么是内联函数?

内联函数,与普通函数基本相同。区别只在于内联函数在函数定义前需要加上inline关键字。
内联函数的目的:

  • 代替部分宏定义,简化代码;
  • 代替普通函数,提高程序运行效率。

二、宏定义

1. 宏定义的声明

1
#define name(parament-list) stuff

如:#define ADD(x, y) ((x) + (y))
注意:nameparament-list的左括号之间不能有空格,否则会被解释为stuff的一部分。

2. 宏定义的优缺点

优点:

  • 提高了复用性和可维护性(一改多改);
  • 参数类型不固定:类似函数重载,可以传入不同参数实现运算;
  • 直接替换,运行效率更高:宏不是函数,因此不会在栈上建立函数栈帧,减少了汇编中pushcall的步骤,提高了运行效率;
    缺点:
  • 会带来运算符优先级问题,导致程序出错:在不同的参数中可能会有不同的结果,所以需要给每个参数加括号。
  • 无法调试:因为不是函数,所以无法调试;
  • 没有类型安全的检查:直接替换;

三、内联函数

1、概念

inline关键字修饰的函数,被称为内联函数
C++编译器在编译时,会在调用内联函数的地方展开,因此没有函数调用建立栈帧的开销(普通函数调用需要额外的步骤来保存状态、传递参数、执行函数体,接收返回值等)。
该功能与宏定义一致,提升了程序运行的效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int oper_add(int a, int b)
{
return a + b;
}

int main()
{
int x = oper_add(1, 2);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
oper_add(int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov DWORD PTR [rbp-8], esi
mov edx, DWORD PTR [rbp-4]
mov eax, DWORD PTR [rbp-8]
add eax, edx
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov esi, 2
mov edi, 1
call oper_add(int, int)
mov DWORD PTR [rbp-4], eax
mov eax, 0
leave
ret