内联函数分析
程序员文章站
2023-10-14 08:51:43
[Toc] 1. 内联函数的声明 在C++中,const常量可以代替宏常数定义,而宏代码段则推荐使用内联函数来代替。 C++中使用 关键字声明内联函数 inline只是一种请求,编译器不一定允许这种请求 inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求 include def ......
目录
1. 内联函数的声明
- 在c++中,const常量可以代替宏常数定义,而宏代码段则推荐使用内联函数来代替。
- c++中使用
inline
关键字声明内联函数 - inline只是一种请求,编译器不一定允许这种请求
- inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
inline int func(int a, int b) { return a < b ? a : b; }
2. 内联函数的特性
- c++编译器直接将内联函数的函数体扩展到函数调用的地方
- 内联函数调用时没有压栈、跳转、返回等额外开销
- 内联函数具有参数检查、返回类型等普通函数特征
- 内联函数与宏代码段相比,保留了比普通函数效率更高、开销更小的优点,摒弃了宏代码段不经过编译器可能带来副作用的缺点
#include <stdio.h> #define max(a, b) ((a) < (b) ? (a) : (b)) inline int max(int a, int b) { return a < b ? a : b; } int main(int argc, char *argv[]) { int a1 = 1; int b1 = 3; int c1 = max(++a1, b1); int a2 = 1; int b2 = 3; int c2 = max(++a2, b2); printf("a1 = %d\n", a1); printf("b1 = %d\n", b1); printf("c1 = %d\n", c1); printf("\n"); printf("a2 = %d\n", a2); printf("b2 = %d\n", b2); printf("c2 = %d\n", c2); return 0; }
3. 内联函数与编译器
- 现代c++编译器能够进行编译优化,函数即使没有inline声明,也可能被内联编译;声明了inline,编译器也未必会同意
- 一些现代c++编译器还提供了扩展语法,允许强制内联,如g++的
__attribute__((always_inline))
__attribute__((always_inline)) int func(int a, int b) { return a < b ? a : b; }
4. 内联函数的限制
c++语言对内联函数具有以下限制:
- 不能存在任何形式的循环语句
- 不能存在过多的条件判断语句
- 函数体不能过于庞大
- 不能对函数进行取址操作
- 函数内联声明必须在调用语句之前
注意:这些只是c++语言本身对内联函数的限制,现代c++编译器可以突破这些限制,实际上,只要函数不是过于夸张,内联一般都是可以成功的。
上一篇: CSS基础 CSS选择符
下一篇: Web开发/设计人员应当知道的15个网站
推荐阅读
-
渲染函数 & JSX详情
-
解决Navicat Premium 连接 MySQL 8.0 报错"1251"的问题分析
-
PHP openssl库,openssl_x509_read函数,报的一个warnning,是怎么回事,怎么解决?!
-
Effective JavaScript Item 55 接受配置对象作为函数参数
-
php中header函数的用法举例详解
-
php函数,php函数手册_PHP教程
-
Python函数中apply、map、applymap的区别
-
C3+jQuery做出动画效果及回调函数
-
c语言 结构体函数:PHP的语言结构和函数的区别
-
php4.0.0远程溢出源代码分析与测试程序_PHP