C++ | 内敛函数 | 内敛函数的性质 | 内敛函数的特点 | 内联函数和普通函数的区别

目录

一.什么是内联函数

二.内联函数和宏的区别

三.内联函数和static修饰的函数的区别

四.使用inline的时机

五.内敛函数的缺点

六.使用内联函数时需要注意的事项


一.什么是内联函数

例如现在有如下一个函数

int sum(int x,int y)
{    
    return x+y;
}

虽然这个函数只有短短的三行,但当调用它时,会进行参数压栈,函数栈帧的开辟和回退过程,这会给系统带来很大的开销。因此我们可以使用内联函数

inline int sum(int x,int y)
{    
    return x+y;
}

所谓的内联函数指的是,在函数的调用点直接把函数的代码展开,并且这一过程中没有其他符号产生,从而提升了整个程序的运行效率。而这一过程是在编译间段进行的。

还需特别注意的是,不是所有被inline修饰的函数都会被编译器当做内联函数来处理,例如递归。

二.内联函数和宏的区别

1.内联函数

  • 处理时机:编译间段。
  • 作用:进行代码展开,有安全检查和类型检查,可以理解为一种更安全的宏。

2.宏

  • 处理时机:预编译间段。
  • 作用:文本替换,没有安全检查和类型检查。

三.内联函数和static修饰的函数的区别

1.内联函数

  • 没有开栈和清栈的开销
  • 直接在调用点把代码展开 

2. static修饰的函数

  • 有开栈和清栈的开销
  • 把属性设为local

四.使用inline的时机

  • 开栈清栈的开销 > 执行的开销 ---> 函数体较小,建议写为inline函数
  • 开栈清栈的开销 < 执行的开销 ---> 函数体较大,不建议写为inline函数

五.内敛函数的缺点

  1. 编译时,编译器不知道形参的值,无法知道递归和循环运行的次数。
  2. 内联函数只在release版本生效,在debug版本不生效。
  3. 内联函数是基于实现的,不是基于声明的。
  4. 以代码膨胀为代价,以空间换时间。 

六.使用内联函数时需要注意的事项

1.内联函数只是给编译器的一个建议,即最终是否将某个函数当为内联函数来处理是由编译器来决定的。

2.内敛函数只能写在头文件中。

内联函数发生上面那种替换是在编译期间,在编译期间编译器为了找到需要找到内联函数的定义,所以在为了方便编译器找到定义,每个文件引用头文件后,都直接拥有这种定义,而不用再去写。而普通函数可以申明和定义分离,主要是编译阶段就不需要函数定义。首先编译阶段找到函数的申明,链接阶段才会去找函数的定义,将之关联起来。

inline函数的特征是在调用的地方插入相应函数的代码,所以编译之后的目标文件里是没有inline函数体的,因为在要调用的地方它都已经用相应的语句替换掉了(当然这只限于内联成功的情况)。
如果我们将inline函数写在cpp文件里,但是绝大多数情况下,在我们用第三方类库的时候,我们只有头文件和目标文件(没有cpp文件),当你调用那个内联函数时,编译器没办法找到它。所以说将inline函数写在cpp文件中是没什么用的。

3.内联函数只在本文件中可见。

 


http://www.niftyadmin.cn/n/1629127.html

相关文章

C++ | 函数重载

一.什么是函数重载 C允许在同一范围中声明几个功能类似的同名函数&#xff0c;但是这些同名函数的形式参数&#xff08;指参数的个数、类型或者顺序&#xff09;必须不同&#xff0c;也就是说用同一个函数完成不同的功能。这就是重载函数。 一组函数要称得上重载&#xff0c;…

修改host简化远程访问

问题描述&#xff1a; 使用本机登陆服务器时&#xff0c;需要经常输入IP地址&#xff0c;在局域网下和非局域网下输入的IP又不一样&#xff0c;十分麻烦&#xff0c;如果可以给IP命名一个简单的名字&#xff0c;岂不是很方便&#xff1f; 解决方法&#xff1a; 修改host文件&am…

C++ | 形参带默认值的函数

#include<iostream>int sum(int a10,int b20) {return ab; }int main() {int a 10;int b 20;int ret sum(a,b);/*mov eax,dword ptr[ebp-8]push eaxmov ecx,dword ptr[ebp-4]push ecxcall sum*/ret sum(a);/*push 14H //将立即数&#xff0c;即形参b的默认值立即入栈…

C++ | new关键字 | new和malloc的区别

new和malloc的区别 new malloc new不需要传入开辟内存的大小 malloc需要传入开辟内存的大小new和delete是两个关键字 malloc和free是两个函数new的返回值类型安全 malloc的返回值&#xff08;void*&#xff09;不安全new开辟内存失败时&#xff0c;抛出异常 malloc开辟内存失…

[翻译]SQL Server等待事件—THREADPOOL

前言&#xff1a; 本文是对SQLSkills上一篇关于SQL Server中THREADPOOL等待的博客的翻译,本文也不是完全翻译&#xff0c;有些地方适当加入了自己的一些认知。如有翻译不对或不好的地方&#xff0c;敬请指出&#xff0c;大家一起学习进步。尊重原创和翻译劳动成果&#xff0c;转…

C++ | const在C和C++中的区别 | 常量和常变量的区别

目录 一.C语言中的const 二.C中的const 三.常量退化为常变量 一.C语言中的const C语言中被const修饰的变量被称为 常变量&#xff0c;并且定义一个常变量时可以不对它进行初始化。如下图所示&#xff0c;我们没有对常变量a进行初始化&#xff0c;但程序依然可以正常运行。 …

bzoj3578: GTY的人类基因组计划2

STL即玄学。。 一看过去就觉得要hash一下吧&#xff0c;顺便瞄了一眼hint那我就想mp记录hash值咯 然而修改不好搞啊。。。暴力重算肯定挂啊。。 %了一下发现原来可以用异或来离散化&#xff08;感觉这个很看脸的样子&#xff09; 把没有重复插入set&#xff0c;这样就不用穷举区…

CSS:目录

ylbtech-CSS&#xff1a;目录1.返回顶部 1、http://www.runoob.com/css/css-tutorial.html2、2.返回顶部3.返回顶部4.返回顶部5.返回顶部 6.返回顶部作者&#xff1a;ylbtech出处&#xff1a;http://ylbtech.cnblogs.com/本文版权归作者和博客园共有&#xff0c;欢迎转载&#…