C语言中内联函数的作用 inline

C语言中内联函数到底有什么作用?

试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子:

点击(此处)折叠或打开

  1. Void myprint()
  2. {
  3. Printf("%d",3);
  4. }
  5. Void main()
  6. {
  7. Int i;
  8. For(i=0;i<100;i++)
  9. Myprint(2);
  10. }

在主函数中调用myprin()函数打印2这个数字,那么我们就要调用函数100次,意味着这个函数要进栈100次,出栈100次,这样一来我们就打印一个小小的2就把大量的时间花费在进栈和出栈之上了,当我们把程序改为如下所示的时候呢:

点击(此处)折叠或打开

  1. Void main()
  2. {
  3. Int i;
  4. For(i=0;i<100;i++)
  5. Void myprint()
  6. {
  7. Printf("%d",3);
  8. }
  9. }
  10. 此时相当于
  11. static inline void myprint(int n);
  12. static inline void myprint(int n)
  13. {
  14. printf("%d",n);
  15. }
  16. void main()
  17. {
  18. int i;
  19. for(i=0;i<100;i++)
  20. myprint(3);
  21. }

此时我们就不需要进栈出栈了,直接打印2就可以了,当然无论任何事,得到了一定的方便之后就必须得付出一定的代价,即此时的空间的问题。打个比方,现在我们要去一个超市买东西,而超市距离我们家有好几里路,此时你要话费一定的时间在去超市的路上,可是现在呢超市已经搬到家里了,我们就没有必要去超市了,因为超市已经在家里了,当然你的家有那么大?能容得下一个超市?所以此时就存在一个空间的问题,即你必须扩大你家,才能够容纳的下一个超市。

对于内存来说也是一样的,减少了对栈的进出时间的开销,我们却扩大了主存的空间来容纳本来在栈里的函数,在C语言中实现这一功能是用内联函数inline来实现的。

这就是inline函数的作用!

c语言中的的内联(inline)函数

发表于 2011 年 01 月 26 日 由 admin

c/c++中的inline,使用在函数声明处,表示程序员请求编译器在此函数的被调用处将此函数实现插入,而不是像普通函数那样生成调用代码(申请是否有效取决于编译器)。一般地说,这样作的优点是省掉了调用函数的开销;缺点则是可能会增加代所生成目标代码的尺寸(二班的除外,二班情况下,inline函数甚至会返过来降低程序的性能)。

实际上,即使没有手工指定inline函数,编译器一般还会选择一些代码量较小但使用频繁的函数作为inline函数,以此作为性能优化的途径之一。

1. 和带参宏定义(Parameterized Macro)的比较

与带参宏定义相比,inline函数具备以下优点:

  • 参数类型检查:宏定义中所使用的参数仅仅是在宏定义中被替换,不进行任何的类型检查
  • 返回值:宏定义中无法使用return返回
  • 便于调试

2. 不同编译器下的inline关键字

尽管c/c++有着自己的语言标准和规范,但不同编译器实现中总会有着这样或那样的区别。inline即是一例。

c99标准

  • inline :用于同一c/cpp文件内部被调用处展开;对外部文件来说函数不可用
  • static inline :用于在同一c/cpp文件内部被调用处展开;一般情况下,编译器并不会为此函数生成单独的目标代码;如遇到内联函数无法展开,或内联函数以地址形式被调用,则编译器将会为此内联函数生成单独的代码;

简单地说,c99中inline关键字申明的函数一般仅用于同一文件,函数本身不会生成单独的目标代码;static关键字修订后,如果需要,则会生成单独的目标代码。

gcc

  • inline :对同一c/cpp文件,函数将会在被调用处展开;对外部文件,此函数等同于"extern"函数
  • static inline :与c99标准中相同
  • extern inline : 仅用于同一c/c++文件内部,在被调用处展开

gcc中的inline关键字与c99中不同,默认情况下(仅使用inline),在同一文件中被调用处当作内联函数展开,而在外部文件调用中等同于普通extern函数(也就是说会生成单独的目标代码);加static关键字修订后,反而不可应用于外部文件,但如果需要可以生成单独的目标代码;gcc扩展的extern inline模式更是缩小函数的使用仅限于在同文件中展开。

ms vc

ms vc中inline的含义基本与c99中相同,此基础上,作了一定扩展

  • __inline :等同于inline
  • __forceinline :强制编译器将函数作为内联函数,除非以下情况
    • 使用了/Ob0选项编译(debug编译默认取值)
    • 函数使用了可变参数
    • 函数本身为递归函数,且未使用#pragma inline_recursion(on)
    • 函数为虚(virtual)函数
    • 程序中使用了地址方式调用了函数
    • ...

3. 其他

一般地,内联函数不能是递归函数或调用递归函数(递归调用会给函数体展开带来麻烦)。

inline应当是用于函数声明(Declaration)而非函数实现(Implementation)。但由于由于不同的编译器下inline关键字所修饰函数的调用范围不一致,因此,一种简单的作法是,将inline函数的声明和实现合一。如果确定函数仅应用于同一文件,我们可以将函数的声明和实现都放在.c/.cpp中;否则将其放入.h中(这样,包含了此头文件的任何文件都可以使用它)。

C语言中内联函数的作用 inline相关推荐

  1. c语言什么是内联函数,C语言中内联函数inline的使用方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 来源一:比特网 来源二:东方锐智 在C++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵 ...

  2. C语言的内联函数的作用

    关内联函数键字inline void myprintf(int a) { priintf("%d",a); } int main() { for(i=0;i<100;i++) ...

  3. VC++ inline内联函数的作用解决方案

    VC++ inline内联函数的作用解决方案 __attribute__((always_inline)) attribute((always_inline))的意思是强制内联,所有加了attribu ...

  4. 对普通函数、宏函数、内联函数的作用机制的探索

    这次我们来分析的是C/C++程序员经常遇到的问题,如何在普通函数.宏函数.内联函数之间做取舍,其实它们三者之间并没有什么绝对的你好我差的说法,只要掌握了三者的作用机制的话,结合实际情况一般都能做出正确 ...

  5. C++中内联函数和宏定义的区别

    1.内联函数在编译时展开,宏在预编译时展开 2.在编译的时候,内联函数可以直接被镶嵌在目标代码中,而宏只是一个简单的文本替换. 3.内联函数可以完成诸如类型检测,语句是否正确等编译功能,宏就不具有这样 ...

  6. Linux中内联函数,Windows 7上的内联函数的doParallel问题(适用于Linux)

    我在 Windows 7和 Linux(SUSE Server 11(x86_64))上都使用R 3.0.1.以下示例代码在Windows上产生错误,但在Linux上不产生错误.列出的所有工具箱在两台 ...

  7. c语言inline不起作用,C语言inline内联函数学习小结

    //inline(内联)函数:将普通的函数定义为inline函数,可以避免普通函数入栈出栈的开销,它是将函数内的代码直接粘贴到调用处.除此之外,它和普通函数无异. //要成为inline函数必须具备以 ...

  8. C++中宏与内联函数

    1宏定义 C++是C的超集,C++继承了C的一个重要特性就是效率,在C中提高程序运行效率的重要手段就是宏,宏可以不用普通函数的调用但使用起来就像普通函数调用一样,宏的实现采用的是预处理器而不是编译器, ...

  9. 【内联函数】inline关键字的作用与内联函数的特性

    学习导航 一.内联函数产生的意义 二.内联函数的使用 三.内联函数的作用 ①简单易懂 ②支持调试 ③支持类型检查 四.内联函数的特性 一.内联函数产生的意义  在C语言中,如果我们频繁调用某些函数,并 ...

最新文章

  1. 通过QUIC 0-RTT建立更快的连接
  2. matlab两个图共用一个x轴_SCI论文写作MATLAB出图(2)
  3. Java中如何实现代理机制(JDK、CGLIB)
  4. 信用算力基于 RocketMQ 实现金融级数据服务的实践
  5. android finish后不能ondestroy_Android面试基础(一)
  6. PBR理论基础3:基于图像的光照(上)
  7. python算法常用技巧与内置库
  8. 环境工程学期末复习完整版
  9. android版本高低有啥好处与不好,WP跟安卓比流畅 但为什么就不好用呢?
  10. DSP 基础学习 1:搭建环境与CCS6创建工程模板
  11. js找出两个数组中的重复项
  12. 磁盘列阵 Raid
  13. web如何加入视频?video
  14. ​NeurIPS 2022 | IPMT:用于小样本语义分割的中间原型挖掘Transformer
  15. 1.2字符类型及操作
  16. 光线追踪(RayTracing)算法
  17. 数据库多对多关系建表
  18. 熬夜肝了万字Android View 知识体系
  19. NOIP2016提高组初赛难点整理
  20. 可怕的QQ浏览器,仅仅开了一个网页,就用了我980M,怎么回事儿?firefox性能依旧坚挺

热门文章

  1. proc文件系统编程
  2. 云服务器怎么用于网站吗,云服务器怎么使用
  3. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩
  4. mysql mgr 5.6_mysql MGR高可用配置
  5. android标题 折叠效果,Android TextView仿微信可折叠效果
  6. maven_SonarQube中的Maven项目的单元和集成测试报告
  7. php 前端页面的路由,ThinkPHP5路由
  8. 你多久没换过壁纸了?新年了,换一换吧!
  9. 面试:数据量很大,分页查询很慢,有什么优化方案?
  10. 不简单的 SimpleDateFormat