宏定义与内联函数的区别与联系

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

1. 宏定义不是函数,但是使用起来像函数。预处理阶段用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。

  内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。内联函数则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率;

2.宏定义是没有类型检查的,无论对还是错都是直接替换,而内联函数在编译时进行安全检查

内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等

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

1. 内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷

2.普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。

内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码

3. 内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行

4.内联函数与static修饰函数的区别: 不用开栈清栈;相同点是所修饰的函数都是本文件可见(起因不同前者是代码展开,后者是static修饰造成生成符号为local属性)

内联的特点:编译阶段的文本插入;

只在debug版本下生效;

只是给编译器的建议,具体适用与否取决于开栈开销大小与执行开销大小的相对关系;

内联基于实现而不是声明,关键字加载定义处;

你可能感兴趣的:(c语言)