内联函数、普通函数、宏定义

来源:互联网 发布:小白鼠吃鸡软件 编辑:程序博客网 时间:2024/06/07 03:03

对于一个频繁使用的短小函数,c用宏定义,c++用inline实现。

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

1、宏定义只是普通的文本替换,宏定义是没有类型检查的,无论对还是错都是直接替换。所以宏替换容易出错,直接替换会产生符号的优先级的问题会一些意想不到的结果。

 

内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等。相对宏替换来说不仅提高了效率还更加安全。

 

2. 宏定义是在预编译的阶段把所有的宏名用宏体来替换,简单的说就是字符串替换。

内联函数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去相对于普通函数的调用的开销,提高效率。

 

3、宏定义不可以调试,但是内联函数可以调试。因为在DBUY模式里面,内联函数不起作用,方便调试。在REALASE模式下才真正进行内联展开。

 

4、多文件之间不可以使用内联函数,因为从符号表的角度来看内联函数在编译阶段不产生符号,否则链接步骤会产生错误:出现无法解析的外部符号。

 

5、相对于普通函数来说,内联函数在调用的地方被展开,可以被编译器根据上下文进行优化。并且普通函数需要进行函数的调用开销,比普通函数来说内联函数效率高。

 

二、内联函数有比较多的限制


1、内联函数只是一种向编译器发出的请求,但是编译器不一定会处理成内联函数。比如递归函数在编译阶段无法知道调用的层数、内联函数的代码体积太长、编译器把这些函数当成普通函数处理。

 

2、关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用。内联函数必须在展开的地方之前看到定义,不能是声明。所以一般把内联函数定义放在头文件中。


原创粉丝点击