【细品C++】内联函数

观前提示

本篇文章共1045词,读完需要5分钟左右

写在前面

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

内联函数

概念及使用

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

inline void demo1()
{
	cout << "inline function" << endl;
}


int main()
{
	demo1();

	return 0;
}

汇编层面

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

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函数体内的内容是相差无几的。

特性

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

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

    在这里插入图片描述

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

    #include"Inline.h"
    //Inline.cpp
    
    inline int demo4()
    {
    	return 1;
    }
    
    #pragma once
    //Inline.h
    
    inline int demo4();
    
    
    #include"Inline.h"
    
    int main()
    {
    	demo4();//无法解析的外部符号 "int __cdecl demo4(void)" (?demo4@@YAHXZ),函数 main 中引用了该符号
    	//fatal error LNK1120: 1 个无法解析的外部命令
    
    
    	return 0;
    }
    
    

    在这里插入图片描述

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

结语

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

彩蛋

源码自取 GitHub gitee

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值