> 文章列表 > 【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

文章目录

  • 一、内联函数概念
  • 二、debug模式下怎么查看内联的优化
    • 第一步:右击解决方案,选择属性
    • 第二步:配置调试信息格式
    • 第三步:配置优化,启用内联函数扩展
  • 三、内联函数特性
  • 总结

一、内联函数概念

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

首先我们来看一段代码:

//不使用内联函数
int add(int num1, int num2)
{return num1 + num2;
}
int main()
{int a = 10;int b = 20;int ret = add(a, b);return 0;
}

【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)
我们发现在不使用内联函数时,调用函数会建立栈帧,有许多的准备工作,造成开销,接下来让我们看看如果使用内联函数会有什么效果。

//使用内联函数
inline int add(int num1, int num2)
{return num1 + num2;
}
int main()
{int a = 10;int b = 20;int ret = add(a, b);return 0;
}

【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)
我们发现在内联函数的优化下,不会建立函数栈帧,如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的
调用。

二、debug模式下怎么查看内联的优化

可能大家这时有疑问了,为什么在我的编译器上加入了内联函数也不会优化呢?这是因为你在debug模式下,需要对编译器进行设置,否则不会展开,那么要如何设置呢?

第一步:右击解决方案,选择属性

【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

第二步:配置调试信息格式

【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

第三步:配置优化,启用内联函数扩展

【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

三、内联函数特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性
    我们使用以下的程序来试一下规模大的内联函数,是否也会展开:
    【C++初阶】第五讲之巧用内联函数(附带vs在debug下如何查看内联函数的优化)

我们发现当调用一个递归函数时,即使我们加上了内联,也不会进行优化,因为递归函数如果优化会造成大量的空间浪费。

  1. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

由于内联函数会直接展开,如果需要展开时只找到声明,就会发生链接错误。

// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{f(10);return 0;
}

总结

优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.

缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。