c++ inline函数和宏、函数调用
2013-12-09 13:39
260 查看
1 函数的调用必须将程序执行的顺序转移到存放函数所的地址,将函数的程序内容执行完成后,再次转到执行该函数的地方,这种转移操作要求执行前保存现场,并记忆执行的地址。因此函数调用有一定的时间和空间开销,影响效率。
2 宏只是在预处理的地方把代码展开,不需要额外的地址和空间。所以宏比函数调用更有效率。
但是宏也有不足。例如宏的定义容易产生二义性。
举个例子
#define square(x) (x*x)
我们用一个数字去调用它,square(5),这样看上去没有什么错误,结果返回25,是正确的,但是如果我们用squre (5+5)去调用的话,我们期望的结果是100,而宏的调用结果是(5+5*5+5),结果是35,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。
#define square(x) ((x)*(x))
3 内联函数(inline)
内联函数和宏很类似,通过把代码插入到调用者代码处的函数。内联函数和宏的区别在于宏是由预处理器对宏进行替代,而内联函数通过编译器控制来实现的。内敛函数是真正的函数,只是在需要用到的时候内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。
当然内联函数的代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式
2 宏只是在预处理的地方把代码展开,不需要额外的地址和空间。所以宏比函数调用更有效率。
但是宏也有不足。例如宏的定义容易产生二义性。
举个例子
#define square(x) (x*x)
我们用一个数字去调用它,square(5),这样看上去没有什么错误,结果返回25,是正确的,但是如果我们用squre (5+5)去调用的话,我们期望的结果是100,而宏的调用结果是(5+5*5+5),结果是35,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。
#define square(x) ((x)*(x))
3 内联函数(inline)
内联函数和宏很类似,通过把代码插入到调用者代码处的函数。内联函数和宏的区别在于宏是由预处理器对宏进行替代,而内联函数通过编译器控制来实现的。内敛函数是真正的函数,只是在需要用到的时候内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。
当然内联函数的代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式
相关文章推荐
- c++调用类内部使用成员变量和inline函数的区别
- C++中inline与函数调用
- C++primer——inline 函数避免函数调用的开销
- C++反汇编->函数调用原理
- C#调用C++ dll 时,涉及到函数参数类型的转换,这里是C++和C#的类型对照表
- Item 5:了解C++默默编写并调用哪些函数【effective C++读书笔记】
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++多态性:虚函数的调用原理
- 类成员声明与定义前加inline的区别(C++ inline 函数)
- C++中构造函数能调用虚函数吗?
- C函数和C++函数相互调用
- C++利用函数调用实现数组数据的输入输出
- C++反汇编代码分析--函数调用
- 为什么在C++里调用被C编译器编译的函数,要加extern "c"
- C++箴言:绝不在构造或析构期调用虚函数
- 几种c++调用dos来调用exe程序的函数用法
- c++怎样让返回对象的函数不调用拷贝构造函数
- C# 调用Dll中非托管C++代码,函数参数的类型对照
- 【Programming In Lua (2E) 笔记】4:用lua扩展C++——C++调用lua函数
- C++中构造函数能调用虚函数吗?(转)