内联函数

C++ 内联函数

拟墨画扇 提交于 2019-11-28 05:52:35
1. 引入inline关键字的原因 在c/c++中, 为了解决 一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。 栈空间 就是指放置程序的局部数据(也就是函数内数据)的内存空间。 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 下面我们来看一个例子: #include <stdio.h> //函数定义为inline即:内联函数 inline char* dbtest(int a) { return (i % 2 > 0) ? "奇" : "偶"; } int main() { int i = 0; for (i=1; i < 100; i++) { printf("i:%d 奇偶性:%s /n", i, dbtest(i)); } } 上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实, 在内部的工作就是在每个for循环的内部任何调用 dbtest(i) 的地方都换成了 (i%2>0)?”奇”:”偶” ,这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。 2. inline使用限制 inline的使用是 有所限制的 ,inline只适合涵数体内代码简单的涵数使用

C++内联函数

孤者浪人 提交于 2019-11-27 16:43:00
C++内联函数 内联函数的实现方法就是在普通函数定义处增加inline关键字,为的是消除函数调用的时空开销,是C++提供的一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。 inline关键字要出现在函数定义处,在函数声明处增加了inline也是会被编译器忽略掉的。 在C++实际开发中一般只将那些短小的、频繁调用的函数定义为内联函数。 在多文件编程中,通常情况下普通函数的定义放在.cpp文件中,将函数的声明放在.h文件中,希望调用函数时,引入对应的头文件即可。但这种做法不适用于内联函数,将内联函数的声明和定义分散到不同的文件中会出错。 情况一: //Test1.h int testMax(int a, int b) ; //Test1.cpp int testMax(int a, int b) { return a > b ? a : b; } //main.cpp #include<iostream> #include<cstdio> #include"Test1.h" using namespace std; int main() { int a = 1, b = 2; cout << testMax(a, b) << endl; system("pause"); return 0; } 结果:正常运行 输出2 情况二:修改Test1.cpp /

6 C/C++之内联函数和宏的区别

安稳与你 提交于 2019-11-27 15:43:38
内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。而宏只是一个简单的替换。 内联函数要做参数类型检查,这是内联函数跟宏相比的优势。 inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,inline可以带来一定的效率提升,而且和C时代的宏函数相比,inline更安全可靠。可是这个是以增加空间消耗为代价的。至于是否需要inline函数,就需要根据实际情况来取舍了。 inline一般只用于如下情况: 1)一个函数不断被重复调用。 2)函数只有简单的几行,且函数内不包含for、while、switch语句。 一般来说,我们写小程序没有必要定义成inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,则应该考虑用inline。 宏在C语言里极其重要,而在C++里用得就少多了。关于宏的第一规则是绝不应该去使用它,除非你不得不这样做。几乎每个宏都表明了程序设计语言里、程序里或者程序员的一个缺陷,因为它将在编译器看到程序的正文之前重新摆布这些正文。宏也是许多程序设计工具的主要麻烦。所以,如果你使用了宏,就应该准备只能从各种工具(如排错系统、交叉引用系统、轮廓程序等)中得到较少的服务。 宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处

(C++算法工程师考点总结)基础

房东的猫 提交于 2019-11-27 14:32:36
1、源程序是如何被编译成可执行的二进制程序的 预处理: 在程序编译之前,由预处理器对C++源程序完成预处理工作。预处理主要将源程序中的宏定义指令、条件编译指令、头文件包含指令以及特殊符号完成相应的替换工作。(该步骤不进行语法检查,这就是inline函数比宏定义安全的原因) 编译器: 以预编译的输出作为输入,利用C++运行库,通过词法分析和语法分析,在确认所有的指令都符合语法规则时,将其翻译成等价的中间代码表示或是汇编语言(.s 文本文件) 汇编器: 将以汇编语言的形式存在的程序转化为机器可识别的二进制代码(.o 二进制文件) 链接器: 经过汇编器之后的目标文件仍然是不可执行的,因为缺乏程序运行必须的动态链接库(.dll)和静态链接库(.lib),链接器就是将程序所引用的外部文件关联起来,形成 .exe 后缀的可执行文件。 2、动态链接库和静态链接库 静态链接库和动态链接库都是共享代码的方式。 静态链接库: 如果采用静态链接库,则无论你愿不愿意,lib中的指令都全部被直接包含在最终生成的EXE文件中。 静态链接库中不能包含其他的静态链接库或者动态链接库。 动态链接库: 若使用动态链接库,该DLL不必被包含在最终的EXE文件中,EXE文件执行时,可以“动态地”引用和卸载这个与EXE独立的DLL文件。 动态链接库中可以继续包含其他的静态链接库或者动态链接库。 3、C/C+

linux系统iot平台编程阶段总结

耗尽温柔 提交于 2019-11-27 13:20:42
1.inline内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 在使用循环里面调用某个函数时,可以使用内联函数。 其实这种有点类似咱们前面学习的动态库和静态库的问题,使调用函数中的代码直接被放到main 函数中,执行for 循环时,会不断调用这段代码,而不是不断地开辟一个函数栈。 inline只适合涵数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。 每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。 2. 来源: https://www.cnblogs.com/wangym/p/11365381.html

【转】Kotlin的inline内联函数

爱⌒轻易说出口 提交于 2019-11-27 13:11:27
原文链接: https://blog.csdn.net/Jaden_hool/article/details/78437947 方法调用流程 调用一个方法是一个压栈和出栈的过程,调用方法时将栈针压入方法栈,然后执行方法体,方法结束时将栈针出栈,这个压栈和出栈的过程会耗费资源,这个过程中传递形参也会耗费资源。 为什么需要inline? 有些简单的方法会被频繁调用,什么叫简单的方法呢,举个例子: fun <T> check(lock: Lock, body: () -> T): T { lock.lock() try { return body() } finally { lock.unlock() } } 这个check方法的方法体中,不会将它的形参再传递给其他方法。我们调用一下 check 方法: check(l, {"我是lambda方法体"})//l是一个Lock对象 对于编译器来说,调用 check 方法就要将参数l和 lambda 表达式 {"我是 lambda方法体"} 进行传递,还要将 check 方法进行压栈出栈处理,这个过程就会耗费资源。 如果我们把 check 方法删除,直接执行 check 方法的方法体: l.lock() try { return "我是lambda方法体" } finally { l.unlock() } 这样做的效果和调用 check

函数的默认参数与内联函数

时光怂恿深爱的人放手 提交于 2019-11-27 00:12:15
函数分声明和定义,但是如果声明和定义是在一些起的,相当于没有声明的话,默认参数与inline就只要写在定义中就可以了。 但是如果函数如果先声明后定义的话,默认参数只能写在声明中,定义时不能再写上默认参数。inline在声明中写,定义时可写可不写. 转载于:https://www.cnblogs.com/GavinDai/archive/2011/11/13/2247269.html 来源: https://blog.csdn.net/weixin_30352191/article/details/99218586

C++--第3课 - 函数的升级-上

与世无争的帅哥 提交于 2019-11-27 00:08:07
第3课 - 函数的升级-上 1. 常量与宏回顾 C++中能够的const常量可以代替宏常数定义,如: const int A = 3; #define A 3 在C++中的解决方案是代替宏代码片段,宏代替代码片段可以避免宏的副作用。 2. 内联函数 (1)C++中推荐使用内联函数代替宏代码片段。C++中使用inline关键字声明内联函数 inline int func(int a, int b) { return a < b ? a : b; } 内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内敛请求。 (2)C++编译器可以将一个函数进行内敛编译。被C++编译器内敛编译的函数叫做内联函数。 内联函数在最终生成的代码中是没有定义的。C++编译器直接将函数体插入函数调用的地方。内敛函数没有普通函数调用时候的额外开销(压栈,跳转,返回)。但是,C++编译器不一定会准许函数的内链请求。 (3)内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)。内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求。内敛函数由编译器处理,直接将编译后的函数体插入到调用的地方。然而,宏代码片段由预处理器处理,进行简单的文本变换,没有任何的编译过程。现在的C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也能被编译器内联编译。另外

eval的两组性能测试数据

喜夏-厌秋 提交于 2019-11-26 22:48:09
引发了最近对eval火爆的讨论,刚好之前也做过类似的测试,我也跟风凑个热闹,提供两组数据供大家参考。 测试环境: a. 机器:Intel(R) Corei7-2720 2.2Ghz (4核心8线程)、内存8Gb b. OS:Windows 7 Enterprise SP1 64-bit c. 浏览器: b.1 Google Chrome 21.0.1180.79 m b.2 Firefox 14.0.1 b.3 IE9.0.8112.16421 d. 测试方法 d.1 每个用例测试5次,耗时取最小值。 d.2 测试过程中 没有 开启Firebug或Chrome Console,开启这些工具会使时间倍增,很难在有效时间内得到该用例结果 用例A1: 我们在内联函数中调用空的eval("") ! function () { var a = 1, b = 2, c = true ; function func() { var d = 2; e = !c; eval(""); } for ( var i = 0; i < 2999999; i++) { func(i, i + 1, i + 2); } }(); 用例A2: 注释掉内联函数中的eval("") !function() { var a = 1 , b = 2 , c = true ; function func() { var

内联函数

一曲冷凌霜 提交于 2019-11-26 06:00:05
C++内联函数通常是跟类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更改一次所有的代码,否则将会继续使用旧的代码。 如果想把一个函数定义为内联函数,需要在函数名前面放关键字inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略inline限定符。 在类定义中的函数都是内联函数,即使没有使用inline说明符。 inline函数的使用: /*** inline.cpp ***/ #include<iostream> using namespace std; inline int Max(int x,int y) { return (x > y) ? x : y; } int main() { cout << "Max (20,10): " << Max(20,10) << endl; cout << "Max (0,200): " << Max(0,200) << endl; cout << "Max(100,1010): " << Max(100,1010) << endl; return 0; } 运行结果: exbot@ubuntu:~/wangqinghe/C++/20190807$ ./inline Max (20