1.什么是内联函数
在普通函数前加inline的就表示内联函数
C++ 中的 inline 用法分类 编程技术
1、引入 inline 关键字的原因
在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,
表示为内联函数。
栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。
在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,
函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。
实例:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 inline char* dbtest(int a) { 5 return (i % 2 > 0) ? "奇" : "偶"; 6 } 7 8 int main() 9 { 10 int i = 0; 11 for (i=1; i < 100; i++) { 12 printf("i:%d 奇偶性:%s /n", i, dbtest(i)); 13 } 14 }
上面的例子就是标准的内联函数的用法,使用 inline 修饰带来的好处我们表面看不出来,其实,
在内部的工作就是在每个 for 循环的内部任何调用 dbtest(i) 的地方都换成了
(i%2>0)?"奇":"偶",这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。
2、inline使用限制
inline 的使用是有所限制的,inline 只适合涵数体内代码简单的涵数使用,
不能作为内联函数的有:
2.1 递归函数
2.2 函数体内含有循环,switch语句的复杂机构的函数
2.3 代码较多的函数
3、inline仅是一个对编译器的建议
inline 函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,
它如果认为函数不复杂,能在调用点展开,
就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
4.建议
inline 函数的定义放在头文件中
其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,
要不然就成了非内联函数的调用了。
所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义。
因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦。
声明跟定义要一致:如果在每个文件里都实现一次该内联函数的话,那么,
最好保证每个定义都是一样的,否则,将会引起未定义的行为。如果不是每个文件里的定义都一样,
那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。
5.缺点
建议 inline 函数的定义放在头文件中
其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。
所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义。
因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦。
声明跟定义要一致:如果在每个文件里都实现一次该内联函数的话,那么,
最好保证每个定义都是一样的,否则,将会引起未定义的行为。如果不是每个文件里的定义都一样
,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。