1 函数在调用时 程序要跳转到被调用函数所在的那个内存地址空间,进而执行被调用函数的代码,待执行完被调用函数后,程序再回到跳转之前的位置继续执行。这就需要在程序跳转之前保存现场并记忆执行的地址,转回后恢复现场,按原来保存的地址继续执行。
这样就会有一定时间和空间的开销影响程序效率。
什么是宏?
1 预处理命令:在源程序中以#开头的命令,如 #include # define
预处理部分: 在源文件中,在函数之外,源程序之前的预处理命令。
预处理:在对源程序的编译的第一次扫描(词法扫描和语法分析)前做的工作。
预处理由预处理程序完成。在源程序编译之前,由系统自动调用预处理程序对预处理部分进行预处理,而后编译源程序。
2 宏:用标示符去表示一个字符串。被定义为宏的标示符 称为 宏名
宏展开:在源程序编译预处理中,对程序中所有出现的“宏名”都用宏定义中的字符串去代换。
从上面可以看出 使用宏的形式 可以省去函数跳转 节省时间和空间的消耗 提高程序效率。
宏的缺点:
(1)无法访问对象私有成员
(2)宏的定义 很容易出现 二义性
我们举个例子:
#define square(x) (x*x)
我们用一个数字去调用它,square(5),这样看上去没有什么错误,结果返回25,是正确的,但是如果我们用squre (5+5)去调用的话,我们期望的结果是100,而宏的调用结果是(5+5*5+5),结果是35,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。
#define square(x) ((x)*(x))
解决办法:内联函数
内联函数 是自身代码被插入到调用者函数代码处的函数。同宏一样 内联避免被调用的开销来提高执行效率。
和宏的区别:宏 由预处理器对宏进行替换 而 内联函数有编译器的控制来实现。
你可以像调用函数一样调用内联函数,同时没有二义性的担忧。
内联函数的定义:
inline void f(int i,char c)
{
}
注意:内联函数必须和函数体声明在一起才有效。