C++的内联函数你了解吗
目录
- 1.概念
- 2.函数演示
- 3.函数特性
- 总结
1.概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
2.函数演示
我们先来看一下普通的函数:
#include <iostream> using namespace std; int Add(int left, int right) { return left + right; } int main() { Add(1, 2); return 0; }
在汇编代码我们可以看出函数调用和压栈:
我们在加inline 试试看:
#include <iostream> using namespace std; inline int Add(int left, int right) { return left + right; } int main() { Add(1, 2); return 0; }
反汇编:
发现还是一样,为什么呢?
在debug版本下编译器不会将内联函数展开,因为展开就调试不了.
我们需要设置一下属性:(vs2019)
首先我们打开属性面板:
接下来进行调试:
没有函数的调用!!
反汇编:
3.函数特性
1.inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
2.inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
4.可以代替宏定义函数.
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
相关推荐
-
C++实操之内联成员函数介绍
目录 前言 什么是内联函数: 如何使一个函数成为内联: 为什么使用内联: 优点 : 缺点 : 关键点 : 总结 前言 在C语言中,我们使用了宏函数,这是编译器用来减少执行时间的一种优化技术.那么问题来了,在C++中,有什么更好的方法来解决这个问题呢?我们引入了内联函数,这是编译器用来减少执行时间的一种优化技术.我们将讨论内联函数的 "what, why, when & how". 什么是内联函数: 内联函数是C++的一个增强功能,可以减少程序的执行时间.函数可以通过指示编译器,
-
C++内联函数详情
内联函数是C++当中为了提高程序运行效率的设计,老实讲我没有在其他语言当中看到类似的设计.它和常规函数之间的主要区别不在于编写的方式,而是在于C++编译器会将内联函数组合到程序当中执行. 要解释这个过程会稍稍有些复杂,我们需要从编译的过程说起.对于编译型语言而言,编译器做的事情是把人类写出来人能读懂的代码翻译成机器能够识别.执行的机器语言,一般是一串十六进制的指令.随后计算机逐步执行这些指令,完成我们想要的功能. 当我们调用函数时,其实本质上是指令跳转,先记录下当前运行的指令位置,跳转到函数所在
-
C++ 内联函数inline案例详解
使用函数能够避免将相同代码重写多次的麻烦,还能减少可执行程序的体积,但也会带来程序运行时间上的开销. 函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中,最后才跳转到函数内部执行.这个过程是要耗费时间的. 另外,函数执行 return 语句返回时,需要从栈中回收形参和局部变量占用的存储空间,然后从栈中取出返回地址,再跳转到该地址继续执行,这个过程也要耗费时间. 总之,
-
C++ 内联函数详解
目录 一.C++ 内联函数 1.内联 2.语法 3.评价 总结 一.C++ 内联函数 1.内联 C 语言中有宏函数的概念.宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销.但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错. 2.语法 C++提供了 inline 关键字,实现了真正的内嵌. 宏函数 VS inline函数 #include <iostream> #include <string.h> using namespace std; //优点:
-
深入理解C++内联函数
目录 内联函数的概念 内联函数和宏 内联函数的特性 总结 内联函数的概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数的使用可以提升程序的运行效率. 举个例子: 在C++中我们通常定义以下函数来求两个整数的最大值: 代码如下: int max(int a, int b) { return a > b ? a : b; } 为这么一个小的操作定义一个函数的好处有: 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它
-
c++内联函数(inline)使用详解
介绍内联函数之前,有必要介绍一下预处理宏.内联函数的功能和预处理宏的功能相似.相信大家都用过预处理宏,我们会经常定义一些宏,如 复制代码 代码如下: #define TABLE_COMP(x) ((x)>0?(x):0) 就定义了一个宏. 为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方.这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行.因此,函数调
-
深入探讨:宏、内联函数与普通函数的区别
内联函数的执行过程与带参数宏定义很相似,但参数的处理不同.带参数的宏定义并不对参数进行运算,而是直接替换:内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数. 内联函数与带参数宏定义的另一个区别是,内联函数的参数类型和返回值类型在声明中都有明确的指定:而带参数宏定义的参数没有类型的概念,只有在宏展开以后,才由编译器检查语法,这就存在很多的安全隐患. 使用内联函数时,应注意以下问题: 1)内联函数的定
-
C++编程中队内联函数的理解和使用
函数调用过程 c++经过编译生成可执行程序文件exe,存放在外存储器中.程序启动,系统从外存储器中将可执行文件装载到内存中,从入口地址(main函数起始处)开始执行.程序执行中遇到了对其他函数的调用,就暂停当前函数的执行,并保存下一条指令的地址作为从被调函数返回后继续执行的入口点,保存现场.然后转到被调函数的入口地址执行被调函数.遇到return语句或者被调函数结束后,恢复先前保存的现场,从先前保存的返回地址处继续执行主调函数的其余部分. 内联函数 函数调用需要进行现场保护,以便在函数调用之后继
-
Kotlin 内联函数详解及实例
Kotlin 内联函数详解及实例 概述 在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方.这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行.也就是通常说的压栈和出栈.因此,函数调用要有一定的时间和空间方面的开销.那么对于那些函数体代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大. 那怎么解决这个性能消耗问题呢,这个时候
-
浅谈内联函数与宏定义的区别详解
用内联取代宏:1.内联函数在运行时可调试,而宏定义不可以;2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会: 3.内联函数可以访问类的成员变量,宏定义则不能: 4.在类中声明同时定义的成员函数,自动转化为内联函数.文章(一)内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义.例如: #define MAX(a,b) ((a)>(b)?(a):(b)) 该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)
-
内联函数inline与宏定义深入解析
内联函数的优越性:一:inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏定义一样展开),没有了调用的开销,效率很高.二:类的内敛函数是一个真正的函数.三:使用内联函数inline可以完全取代表达式形式的宏定义. 例子: 复制代码 代码如下: Class A{public:int readTest(){return nTest:}void setTest(int i);};inline void A::setTest(int i){nTest=i;}; 说明:类A
-
C语言中的内联函数(inline)与宏定义(#define)详细解析
先简明扼要,说下关键:1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快. 2.内联函数可以调试,而宏定义是不可以调试的.内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline.下面详细介绍一下探讨一下内联函数与宏定义. 一.内联函数是什么?内联函数是代码被插入到调用者代码处的函数.如同 #define 宏(但并不等同,原因见下文),内联函数通过避免被调用的开销来提
-
详解C++中的内联函数和函数重载
内联函数(内嵌函数,内置函数) 调用函数时需要一定的时间和空间的开销.C++提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开.这种在函数调用处直接嵌入函数体的函数称为内联函数(inline function),又称内嵌函数或内嵌函数. 指定内联函数的方法很简单,只需要在定义函数时增加 inline 关键字. 注意:是在函数定义时增加 inline 关键字,而不是在函数声明时.在函数声明时增加 inline 关键虽然没有错误,但是也没有任何效果 inline 关键
-
c++中的内联函数inline用法实例
问题描述:类中成员函数缺省默认是内联的,如果在类定义时就在类内给出函数定义,那当然最好.如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联的.内联函数的inline要加在函数前面,不可以加在声明前面. class A { public:void Foo(int x, int y) { } // 自动地成为内联函数 } //正确写法: // 头文件 class A { public: void Foo(int x, int y); } // 定义文
-
kotlin Standard中的内联函数示例详解
let.with.run.apply.also.takeIf.takeUnless.repeat函数的使用 kotlin Standard.kt文件中,提供了一些内联函数,这些内联函数可以减少代码量,在使代码优美的同时,打打提高开发效率.它们分别为: run.with.let.also.apply let let函数的定义如下: public inline fun <T, R> T.let(block: (T) -> R): R = block(this) 默认当前这个对象作为闭包的it
随机推荐
- PHP游戏编程25个脚本代码
- ascii码表(二进制 十进制 十六进制)详细介绍
- iOS 正则表达式详解
- asp.net使用ashx生成图形验证码的方法示例
- JavaScript 程序错误Cannot use 'in' operator to search的解决方法
- asp.net ListView 数据绑定
- Android中Activity启动默认不显示输入法解决方法
- 自己编写的类似JS的trim方法
- PYTHON 中使用 GLOBAL引发的一系列问题
- 多域名一网站时如果返回最原来的域名
- 用JS写的一个Ajax库(实例代码)
- 扩展Hibernate使用自定义数据库连接池的方法
- PHP无刷新上传文件实现代码
- rsync ssh 数据同步分析
- Javascript数组中push方法用法分析
- Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
- java中FileOutputStream中文乱码问题解决办法
- Android 判断当前语言环境是否是中文环境
- Android4.2中全屏或者取消标题栏的方法总结
- linux sort多字段排序实例解析