内联函数

内联函数与宏

守給你的承諾、 提交于 2019-12-26 06:13:03
宏 ,我们有时会定义一些预处理宏,如 #define COMP(x) ((x)>0?(x):0)   就定义了一个宏。 使用宏的原因是——函数调用有一定的时间和空间开销(在函数调用的使用程序跳到函数所在内存中的地址,执行完之后再跳回原来的位置继续执行。这种转移需要保存现场并记忆当前内存位置,执行完函数之后再恢复现场),而宏只是在预处理的地方把代码展开,不需要额外的时间空间开销,因而提高了效率。 内联函数 ,使用Inline来定义,在类的内部定义了函数体的函数被默认为内联函数。 内联函数在 C++类中,应用最广的,应该是用来定义存取函数。 我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。 Class Test{   Private:    Int test;   Public:    Int getTest(){ return test;}   Void setTest(int t) {test=t;} } 内联函数和宏的区别在于,宏是由 预处理器 对宏进行替代,而内联函数是通过 编译器控制 来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销

C++内联函数与宏定义

一曲冷凌霜 提交于 2019-12-26 06:12:40
用内联取代宏: 1.内联可调试; 2.可进行类型安全检查或自动类型转换; 3.可访问成员变量。 另外,定义在类声明中的成员函数自动转化为内联函数。 文章(一) 内联函数与宏定义   在C中,常用预处理语句#define来代替一个函数定义。例如:     #define MAX(a,b) ((a)>(b)?(a):(b))   该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)>(b)?(a):(b))所替换。   宏定义语句的书写格式有过分的讲究, MAX与括号之间不能有空格,所有的参数都要   放在括号里。尽管如此,它还是有麻烦:     int a=1,b=0;     MAX(a++,b); //a被增值2次     MAX(a++,b+10); //a被增值1次     MAX(a,"Hello"); //错误地比较int和字符串,没有参数类型检查     MAX( )函数的求值会由于两个参数值的大小不同而产生不同的副作用。     MAX(a++,b)的值为2,同时a的值为3;     MAX(a++,b+10)的值为10,同时a的值为2。   如果是普通函数,则MAX(a,"HellO")会受到函数调用的检查,但此处不会因为两个参数类型不同而被编译拒之门外。幸运的是,通过一个内联函数可以得到所有宏的替换效能和

内联函数和宏比较

倾然丶 夕夏残阳落幕 提交于 2019-12-26 06:12:26
函数内联 用内联取代宏代码 ---------------- C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。 在C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。 预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、 返回参数、执行return等过程,从而提高了速度。 使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。 对于C++ 而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员。 让我们看看C++ 的"函数内联"是如何工作的。 对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。 如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。 在调用一个内联函数时,编译器首先检查调用是否正确 (进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。 如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。 这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换。 假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。 C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员。 所以在C++ 程序中

函数内联

冷暖自知 提交于 2019-12-26 06:12:08
http://blog.csdn.net/lwbeyond/article/details/6445370 函数内联 1. 用内联取代宏代码 C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。 在 C 程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函 数。 预处理器用复制宏代码的方式代替函数调用, 省去了参数压栈、 生成汇编语言的 CALL 调用、返回参数、执行 return 等过程,从而提高了速度。使用宏代码最大的缺点是容 易出错 ,预处理器在复制宏代码时常常产生意想不到的边际效应。 例如 #define MAX(a, b) (a) > (b) ? (a) : (b) 语句 result = MAX(i, j) + 2 ; 将被预处理器解释为 result = (i) > (j) ? (i) : (j) + 2 ; 由于运算符‘ +’比运算符‘ :’的优先级高,所以上述语句并不等价于期望的 result = ( (i) > (j) ? (i) : (j) ) + 2 ; 如果把宏代码改写为 #define MAX(a, b) ( (a) > (b) ? (a) : (b) ) 则可以解决由优先级引起的错误。但是即使使用修改后的宏代码也不是万无一失的,例 如语句 result = MAX(i++, j); 将被预处理器解释为 result =

C++ 函数探幽

亡梦爱人 提交于 2019-12-24 21:41:21
内联函数 内联函数是C++为提高程序运行速度所做的一项改进,其编写方式与常规函数并没有本质的不同(除了不能递归与关键字inline之外)。 内联函数的意义? 在程序运行过程中,如果需要调用一个函数,程序会保存当前函数的执行现场,将函数中的局部变量以及函数地址压入堆栈,然后再将即将调用的新函数加载到内存中,这要 经历复制参数值、跳转到所调用函数的内存位置、执行函数代码、存储函数返回值等过程,当函数执行完后,再获取之前正在调用的函数的地址,回去继续执行那个函数。 如果程序多次调用这个函数,势必造成一定的开销。 内联函数提供另一种选择:内联函数的编译代码与当前程序的代码“内联”起来,也就是编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置执行代码,再跳回来。 内联函数的运行速度比常规函数稍快,但代价是 需要占用更多内存 。 不易使用内联函数的情况 函数体内的代码比较长,使用内联将导致可执行代码膨胀过大 执行函数代码的时间比处理函数调用机制的时间长,则节省的时间将十分有限。 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行)。 程序员请求将函数作为内联函数时,编译器并不一定会满足这种请求。如果函数过大或者调用了自己,编译器可能不会将其作为内联函数。而有些编译器没有启用或者实现这一特性。

kotlin 回调函数、let、also、run 、with、apply 使用总结

扶醉桌前 提交于 2019-12-23 09:01:39
kotlin lambda 简化 ————————kotlin 回调函数、let、also、run 、with、apply 使用总结 Lambda 表达式( lambda expression )是一个匿名函数。编程中提到的 lambda 表达式,通常是在 需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。 回调函数 内联函数 let 内联函数 also 内联函数 with 内联函数 run 内联函数 apply 用法总结 一、回调函数 回调函数的Java写法 mEditText . addTextChangedListener ( new TextWatcher ( ) { @Override public void afterTextChanged ( Editable editable ) { // TODO } } ) ; 回调函数的kotlin写法 mEditText ? . addTextChangedListener ( object : TextWatcher { override fun afterTextChanged ( editable : Editable ) { // TODO } } ) 在Kotlin中,对于 接口只有一个回调的方法,符合使用lambda mEditText . addTextChangedListener (

描述编译和链接过程

谁都会走 提交于 2019-12-20 18:04:09
原文摘自: http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html [yc]详解link 详解link 有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行)。或者对语言的一些部分不知道为什么要(或者不要)这样那样设计。了解本文之后,或许会有一些答案。 首先看看我们是如何写一个程序的。如果你在使用某种IDE(Visual Studio,Elicpse,Dev C++等),你可能不会发现程序是如何组织起来的(很多人因此而反对初学者使用IDE)。因为使用IDE,你所做的事情,就是在一个项目里新建一系列的.cpp和.h文件,编写好之后在菜单里点击“编译”,就万事大吉了。但其实以前,程序员写程序不是这样的。他们首先要打开一个编辑器,像编写文本文件一样的写好代码,然后在命令行下敲 cc 1.cpp -o 1.o cc 2.cpp -o 2.o cc 3.cpp -o 3.o 这里cc代表某个C/C++编译器,后面紧跟着要编译的cpp文件,并且以-o指定要输出的文件(请原谅我没有使用任何一个流行编译器作为例子)。这样当前目录下就会出现: 1.o 2.o 3.o 最后

inline函数

谁说胖子不能爱 提交于 2019-12-17 23:08:05
inline函数 1.什么是inline函数 内联函数是指用inline关键字修饰的函数。如果内联函数在类体内定义,不用inline关键字声明,默认为内联函数, 在编译阶段遇到函数调用直接进行代码展开。 2.内联具体是怎么实现的? 编译器在它的符号表里放入函数类型和参数(包括函数名字和参数类型及返回值类型),另外,编译器看到内联函数和内联函数的分析没有错时,函数的代码也被放入符号表中,代码是以源程序的形式存放还是以编译过的指令存放取决于编译器。 3.inline 函数的优缺点 优点: 没有函数的开栈与清栈过程使得效率高。 缺点: 1. 以代码膨胀为代价,用空间换取了时间。 2.如果内联函数发生了改动,那么就需要重新编译代码; 3.要把内联函数放在头文件中; 建议: 开栈和清栈消耗 > 执行的消耗 代码少 设置为inline函数 执行的消耗 > 开栈的消耗 代码多 不设置inline函数 4.inline 函数注意事项 1.inline的定义和实现写在头文件中, 2.inline 函数只在release版本生效, 3.inline函数只是给编译器的一个建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展 开,就会真正内联,并不是说声明了内联就会内联。(例如,递归,for,switch等 ) inline void Print(int *arr, int

内联函数与宏定义

久未见 提交于 2019-12-17 02:54:35
内联函数与宏定义 我们知道,在调用函数的过程中是使用栈进行的调用,调用栈比较消耗内存,所以我们便想通过使用内联函数或者是宏定义来达到在减小内存的情况下进行函数调用的效果。 1.宏定义 宏定义是要先通过预处理的,优点是消耗内存小(比起栈方法调用函数宏定义是直接插入),缺点是宏定义的预处理只是简单地文本置换(可能会出现如下代码的问题)。 # include <iostream> # define SUM 3+4 using namespace std ; int main ( ) { cout << SUM * SUM << endl ; return 0 ; } 结果本应该是49,可是由于宏定义是进行的简单地进行文本替换,也就变成了 3+4*3+4 = 19 2.内联函数 想要减小内存的开销,又想避免宏定义容易出现的问题,那么内联函数就是一个不错的选择。 内联函数是在通过编译器进行判断的,加上inline 只是给编译器一个建议,让编译器考虑把该函数改成内联函数,但是如果函数本身过于复杂,就算加上了inline,编译器也不会将函数改为内联的。 放在类中的函数编译器都 默认加上inline class Base { public : //构造函数 Base ( ) { } //析构函数 ~ Base ( ) { } //声明f函数 void f ( ) { cout << "This

宏、内联函数和普通函数的区别

こ雲淡風輕ζ 提交于 2019-12-16 10:22:42
内联函数的执行过程与带参数宏定义很相似,但参数的处理不同。带参数的宏定义并不对参数进行运算,而是直接替换;内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算求值,然后把表达式的值传递给形式参数。 内联函数与带参数宏定义的另一个区别是,内联函数的参数类型和返回值类型在声明中都有明确的指定;而带参数宏定义的参数没有类型的概念,只有在宏展开以后,才由编译器检查语法,这就存在很多的安全隐患。 使用内联函数时,应注意以下问题: 1)内联函数的定义性声明应该出现在对该函数的第一次调用之前。 2)内联函数首先是函数,函数的很多性质都适用于内联函数,如内联函数可以重载。 3)在内联函数中不允许使用循环语句和switch结果,带有异常接口声明的函数也不能声明为内联函数。 先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类 型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的. 3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的 是编译的时间,而函数占用的是执行时的时间. 4. 宏的参数是不占内存空间的,因为只是做字符串的替换