C++ - 内联函数

202 阅读1分钟

一. 内联函数的定义

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

二. 内联函数带来的优化

未使用内联函数时需要调用 Add 函数.

image.png

如果在上述函数前增加 inline 关键字将其改成内联函数, 在编译期间编译器会用函数体替换 Add 函数的调用.

image.png

三. 内联函数的特性

1. 内联函数的优缺点

inline 是一种以空间换时间的做法, 如果编译器将函数当成内联函数处理, 在编译阶段, 会用函数体替换函数调用.

缺陷: 可能会使目标文件变大.

优势: 减少函数调用开销, 提高程序运行效率.

2. inline 只是一个建议

inline 对于编译器而言只是一个建议, 不同编译器关于 inline 实现机制可能不不同, 一般建议: 将函数规模较小 (即函数不是很长, 具体没有准确的说法, 取决于编译器内部实现) 不是递归、且频繁调用的函数采用 inline 修饰, 否则编译器会忽略 inline 特性.

下图为《 C++ primer 》第五版关于 inline 的建议:

image.png

3. inline 声明和定义不能分离

inline 不建议声明和定义分离, 否则会导致链接错误. 因为使用 inline 后函数被展开, 在符号表中没有 inline 函数的地址, 无法进行链接.

Func.h

#pragma once
#include <iostream>
using namespace std;

inline void Func(int i);

Func.cpp

#include "Func.h"

void Func(int i)
{
    cout << i << endl;
}

test.cpp

#include "Func.h"

int main()
{ 
    Func(0);  
    return 0;
}

image.png