前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【细品C++】内联函数

【细品C++】内联函数

作者头像
Crrrush
发布2023-06-23 14:38:29
1160
发布2023-06-23 14:38:29
举报
文章被收录于专栏:后端开发练级指南

写在前面

本篇文章件将帮助你了解C++的内联函数。内联函数的概念并不难理解,功能也十分清晰,就是降低频繁调用内容短小函数时建立函数栈帧时所带来的消耗,在C中,可以用宏函数解决,但不够好,于是C++设计出了内敛函数。希望本篇文章能对你C++的内联函数学习有所帮助。

内联函数

概念及使用

使用inline修饰的函数就叫做内联函数,一个函数被指定为内联函数后,(通常)编译时编译器会将此函数在函数调用点展开,这也就意味着此时调用函数并不会向以往一样开辟函数栈帧,从而减少建立函数栈帧的消耗,提升程序运行的效率

代码语言:javascript
复制
inline void demo1()
{
	cout << "inline function" << endl;
}


int main()
{
	demo1();

	return 0;
}

汇编层面

接下来从汇编层面看看是如何展开函数内容的。在这之前,我先解释一下我在我使用的编译环境(vs2022Debug)下是如何看到内联函数的汇编情况的。首先贴出我的调试代码。

代码语言:javascript
复制
inline void demo1()
{
	cout << "inline function" << endl;
}

void demo2()
{
	cout << "function" << endl;
}

int main()
{
	demo1();

	demo2();

	return 0;
}

由于在Debug环境下,为了便于调试,编译器并不会真正地将这个内联函数真正地“内联”式地展开。

在这里插入图片描述
在这里插入图片描述

解决方法:1、可以在release下查看生成的汇编代码

​ 2、在Debug调整编译器的设置(如下)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来只需要正常进入调试,并转到反汇编就能看到实际现象了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到demo1展开的内容与demo2函数体内的内容是相差无几的。

特性

inline是一种以空间换时间的设计,编译器将函数当作内联函数处理时,会在编译阶段用函数体替换函数调用。所以会有可能使目标文件(最终形成的可执行文件、软件包)过大的缺陷,当然少了函数栈帧的调用开销,程序的运行效率也会升高。

inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议将函数规模较小(函数较短,内容较少,没有准确的判定标准,具体取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为《C++Primer》第四版关于inline的建议

在这里插入图片描述
在这里插入图片描述

inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址,也不会进符号表,在链接阶段是无法找到函数的定义的。

代码语言:javascript
复制
#include"Inline.h"
//Inline.cpp

inline int demo4()
{
	return 1;
}
代码语言:javascript
复制
#pragma once
//Inline.h

inline int demo4();
代码语言:javascript
复制
#include"Inline.h"

int main()
{
	demo4();//无法解析的外部符号 "int __cdecl demo4(void)" (?demo4@@YAHXZ),函数 main 中引用了该符号
	//fatal error LNK1120: 1 个无法解析的外部命令


	return 0;
}
在这里插入图片描述
在这里插入图片描述

在C中,写一个短小函数时可以使用宏函数,但是由于宏的特性,虽然能增强代码复用性,提高性能,但是却不方便调试,可读性,可维护性差,易误用且没有类型安全的检查。所以C++设计出内敛函数,既有兼容函数的优点,又能减少函数栈帧的开销提高效率。

结语

以上就是C++的内联函数的讲解,如果你觉得写得还不错的话请多多点赞收藏加分享,当然如果发现我写的有错误或者有建议给我的话欢迎在评论区或者私信告诉我。

彩蛋

源码自取 GitHub gitee

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 内联函数
    • 概念及使用
      • 汇编层面
        • 特性
        • 结语
        • 彩蛋
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档