概述
首先先看一下什么是inline函数?
inline (内联函数):是在函数调用点将函数代码进行展开。
其实吧,这里的展开就是给编译器的一个建议,建议编译器将内联函数展开,具体会不会展开,还是要看编译器的处理,比如说如果我们在内联函数中出现了递归的使用,这样的话,编译器就不会进行将它展开,因为编译器只是进行词法,语法,语义分析,并不知道程序在运行的时候会进行递归多少层。在编译期间,复制代码到函数调用处,不会产生符号表,也不存在函数堆栈的开辟和栈帧回收。一般在函数的代码量比较少,函数的执行开销小于函数的调用开销时,才会使用内联函数。
inline函数与普通函数的区别:
1. 内联函数不开辟栈帧和回收栈帧,在调用时展开代码,而普通函数在调用时需要开辟栈帧和回收栈帧。
2.普通函数会在编译完之后生成函数名对应的符号,链接的时候在符号表上可以找到,而内联函数不生成符号。
3.内联函数可以放在头文件中,方便调用,但是如果将普通函数放在头文件中,多个文件编译用到一个头文件时,可能会产生函数的重定义。
注意:内联函数在release版本中是这样,在debug版本中除了不生成符号表,和普通的函数无差别,也需要栈帧开辟(方便调试),在内联函数中是不允许使用循环语句和switch语句的,带有异常接口声明的函数也不能声明为内联函数。
缺点:函数展开时可能会产生大量的冗余,效率也并不高
内联函数与宏的区别:
1.宏在预编译阶段进行字符替换,没有安全检查,内联函数在编译阶段展开,编译阶段有安全检查,内联函数相对宏更安全。
2.宏无法调试,内联函数可以调试
3.内联是一种更安全的宏。
static函数与普通函数的区别:
1.普通函数是整个工程可见的,static只是本文件可见
2.static函数形成的符号是局部的,local,链接器是不可见的,而普通函数生成的符号是全局的,global,链接器是可见的。
const与宏的区别:
1.宏是在预处理阶段对所定义的常量进行替换展开,而const是在编译阶段进行。
2.宏定义仅仅是替换和展开,并不进行内存的分配而const常量编译器会分配内存,在堆或栈上;
3.宏定义没有类型检查和安全检查,所以就会导致边际效应,出现不可预知的错误,而const会在编译阶段进行类型检查和安全检查。
inline函数的缺点:
1、内联函数的函数体不宜过大。代码一般十几行。如果内联函数的函数体过大,一般的编译器会放弃内联方式,使用普通方式
2、内联是以代码膨胀为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
3、内联函数的调用都是要复制代码,使程序的总代码量增大,消耗更多的内存空间。
以下情况不适宜使用内联:
1、如果函数体内的代码比较长,使用内联导致内存消耗代价较高
2、如果函数体出现循环,执行函数体内代码的时间要不函数调用的开销大
3、类的构造函数和析构函数容易让人误解成使用内联更有效。
以上如果有没有总结全的,请各位同仁进行评论和给出建议。
最后
以上就是小巧羽毛为你收集整理的C++中的inline函数、static函数、宏和普通函数的详细区别的全部内容,希望文章能够帮你解决C++中的inline函数、static函数、宏和普通函数的详细区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复