C++内联函数
来源:互联网 发布:艾蕾 知乎 编辑:程序博客网 时间:2024/05/18 05:00
内联函数
c++扩展了c语言的函数功能。通过inline关键字用于函数的定义,并在首次调用函数前提供其函数的定义,可以使得C++编译期将该函数视为内联函数。也就是说编译期不是让程序跳到独立的代码片段,以执行函数。而是用相应的代码来替换函数调用。
Google C++编码规范中则规定:
- 一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!
编程风格
关键字 inline 必须与函数定义 体放在一起才能使函数成为内联 ,仅将 inline 放在 函数声明前面不起任何作用 。如下风格的函数 Foo 不能成为内联函数:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起,不起任何作用 void Foo(int x, int y) { … } 而如下风格的函数 Foo 则成为内联函数: void Foo(int x, int y); inline void Foo(int x, int y) // inline 与函数定义体放在一起 { … }
所以说, inline 是一种“用于实现的关键字” ,而不是一种“用于声明的关键字” 。 一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内 联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数 的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量 C++/C 程序设计风格 的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需 要内联。
定义在类声明之中的成员函数将自动地成为内联函数,例如
//头文件 class A { public: void Foo(int x, int y); } // 定义文件 inline void A::Foo(int x, int y) { … }
特点
- 内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直
接忽略内联请求。 - C++编译器直接将函数体插入在函数调用的地方 。
- 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。
- 内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型
等)。 - 内联函数由 编译器处理,直接将编译后的函数体插入调用的地方,
宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程。 编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优
势只是省去了函数调用时压栈,跳转和返回的开销。因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。
C++中内联编译的限制:
- 不能存在任何形式的循环语句
- 不能存在过多的条件判断语句
- 函数体不能过于庞大
- 不能对函数进行取址操作
- 函数内联声明必须在调用语句之前
内联与宏
参考:
函数内联
总结
优点
避免调用时的额外开销(入栈与出栈操作)
代价:
由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码
段的空间。
本质
以牺牲代码段空间为代价,提高程序的运行时间的效率。
适用场景
函数体很“小”,且被“频繁”调用。
阅读全文
0 0
- C语言内联函数
- C++:内联函数
- C 内联函数
- c++-inline 内联函数
- C语言内联函数
- C++_inline内联函数
- 【C++】内联函数,inline
- C++---函数内联
- C 内联函数
- [C++]内联函数
- c/c++内联函数
- C++_内联函数
- c++inline内联函数
- C++:内联函数
- 【C++】内联函数
- C中的内联函数行为
- linux c/c++ 内联函数
- C中的内联函数行为
- 服务器探索(一):密钥对
- Rxjava2之rxandroid基本用法
- 关于web传给后台的json中包含特殊字符导致无法解析的解决方案
- poj1230 贪心
- hibernate检索方式详解
- C++内联函数
- iphone空间占用上的QQ程序竟然搞到2个多G,但是QQ本身只有100M左右,剩下的都是QQ接受的文件、视频、图片等,怎么清除这些,腾出空间?
- pandas 使用
- Ubuntu 16.04 LTS 配置 theano 笔记
- 移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组
- 解决CentOs下SeLinux拦截nginx读取文件的问题
- 数据结构的一些摘要
- 解决乱码问题
- Python3学习笔记