博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ inline函数
阅读量:4695 次
发布时间:2019-06-09

本文共 1495 字,大约阅读时间需要 4 分钟。

1.什么是内联函数

在普通函数前加inline的就表示内联函数

C++ 中的 inline 用法分类 编程技术

1、引入 inline 关键字的原因
在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,
表示为内联函数。
栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。
在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,
函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。

实例:

1 #include
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 函数的定义放在头文件中
其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。
所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义。
因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦。
声明跟定义要一致:如果在每个文件里都实现一次该内联函数的话,那么,
最好保证每个定义都是一样的,否则,将会引起未定义的行为。如果不是每个文件里的定义都一样
,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。

转载于:https://www.cnblogs.com/mch5201314/p/11482690.html

你可能感兴趣的文章
Linux内核高端内存
查看>>
2016年10月30日--JavaScript语法
查看>>
MiCode 40: 找小“3”
查看>>
UVa 11300 Spreading the Wealth 分金币
查看>>
[leetcode] Happy Number
查看>>
Java第五周学习总结
查看>>
j.c.Warnsdorff马踏棋盘算法
查看>>
git私服
查看>>
the openning
查看>>
python 字符串 和 print
查看>>
MAC OS下安装Minizip
查看>>
Java_Certificates does not conform to algorithm constraints
查看>>
PAT 1027. Colors in Mars
查看>>
linux定时执行脚本
查看>>
Oauth支持的5类 grant_type 及说明
查看>>
ASP.NET 5 DNX SDK删除旧版本
查看>>
Android ListView 九大重要属性详细分析
查看>>
[LeetCode] 670. Maximum Swap 最大置换
查看>>
CC++中sizeof函数的用法
查看>>
SPFA 算法详解( 强大图解,不会都难!) (转)
查看>>