宏函数
c语言中有宏函数的概念。宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销。但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错。
举例: #define SQR(i) ((i)*(i))
int main()
{
int i=4;
SQR(i); //这种形式是可以的,这样的话,宏函数可以直接替换SQR
SQR(i++); //不同编译器解释也不同,会发生歧义,不会进行类型检查。
return 0;
}
宏函数优点:代码内嵌,避免函数的调用,会进行类型检查。
缺点:易产生歧义,易使 text 段体积增大(浪费空间,节约时间)
函数
int sqr(int i)
{
return i*i;
}
优点: 一段高度抽象的逻辑,不易产生歧义,使 text 段体积变小。
缺点:函数调用的压栈与出栈的开销。(浪费时间,节约空间)
内联函数(函数和宏函数之间)
兼有了宏函数和函数的很多优点。
语法:
inline int sqr (int x)
{
return x*x;
}
为何所有函数都写成inline?
这由于text段有限,无法包含很多。而且若把很多行的函数作为内联函数,则系统就会跟register一样,进行优化,把内联函数变成普通的函数。换句话说,一个函数不加inline肯定不是内联,但是加了inline 也不一定是。
对其评价
优点:避免调用时的额外开销(入栈与出栈操作)
代价:由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码段的空间。
本质:以牺牲代码段空间为代价,提高程序的运行时间的效率。
适用场景:函数体很“小”,且被“频繁”调用。
版权声明:本文为博主原创文章,未经博主允许不得转载