c语言中inline函数
来源:互联网 发布:微信外卖源码 编辑:程序博客网 时间:2024/04/19 23:25
c语言中的的内联(inline)函数
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
- __inline :等同于inline
- __forceinline :强制编译器将函数作为内联函数,除非以下情况
- 使用了/Ob0选项编译(debug编译默认取值)
- 函数使用了可变参数
- 函数本身为递归函数,且未使用#pragma inline_recursion(on)
- 函数为虚(virtual)函数
- 程序中使用了地址方式调用了函数
- ...
3. 其他
一般地,内联函数不能是递归函数或调用递归函数(递归调用会给函数体展开带来麻烦)。
inline应当是用于函数声明(Declaration)而非函数实现(Implementation)。但由于由于不同的编译器下inline关键字所修饰函数的调用范围不一致,因此,一种简单的作法是,将inline函数的声明和实现合一。如果确定函数仅应用于同一文件,我们可以将函数的声明和实现都放在.c/.cpp中;否则将其放入.h中(这样,包含了此头文件的任何文件都可以使用它)。
- c语言中inline函数
- C语言inline函数
- C语言inline函数
- c语言中的inline函数
- C语言 inline类型函数
- C语言 inline类型函数
- C语言inline函数使用
- C语言内联函数inline
- 嵌入式C语言编程中Inline函数的应用
- C语言中内联函数的作用 inline
- Android中c++inline函数
- c语言 inline函数的总结
- c语言中的的内联(inline)函数
- c语言中的的内联(inline)函数
- c语言 inline函数的总结
- C语言inline函数的使用方法
- C语言inline函数的使用方法
- c语言中的的内联(inline)函数
- 求两条直线(线段)的交点
- python+opencv+android手机在ubuntu上作为IP摄像头
- Qt网络通信骨架解析,QtClient QtServer QtSerialPort
- 程序的多文件组织
- (OK)(OK) download_compile_android-x86_64_in_IBM-X3650-M4
- c语言中inline函数
- html学习笔记之列表
- 第2周项目2-程序的多文件组织
- 第二周项目2-程序的多文件组织
- Linux手册(manual)使用
- 自定义菜单查询和删除
- mysql查询和缓存原理
- Android开发高级进阶02
- 城市省份学校区域数据字典