一、内联函数不一定成功
1、内联函数的优缺点
" 内联函数 " 不是在运行时调用的 ,
" 内联函数 " 是 编译时 将 函数体 对应的 CPU 指令 直接嵌入到调用该函数的地方 ,
从而 降低了 函数调用的开销 , 提高了程序的执行效率 ;
内联函数 的 缺点 也很明显 , 就是会增加代码的大小 , 调用了多少次内联函数 , 就要拷贝多少次内联函数的代码指令到调用的地方 ;
要谨慎使用 " 内联函数 " , 避免不必要的 开销 和 代码膨胀 ;
2、C 编译器 不一定允许内联函数的内联请求
由于 " 内联函数 " 会导致不必要的 开销 和 代码膨胀 , 因此 , C 编译器并不一定保证内联请求的成功 ;
使用 inline 关键字 可以请求 C 编译器将函数进行内联 , 但是编译器并不一定会接受这个请求 ;
权衡利弊 : " 内联函数 "是否 成功内联 取决于 C 编译器 的 实现 和 优化策略 ;
- 内联函数 优点 是 可以减少函数调用的开销,提高程序的执行效率 ;
- 内联函数 缺点 是 会增加代码的大小 , 会降低程序的性能 ;
因此,编译器在决定 " 内联函数 " 是否 内联时 , 会进行权衡 内联带来的性能提升 和 代码大小增加的开销 ;
3、是否内联决定权在编译器手中
是否内联决定权在编译器手中 : 在 C 语言中,inline关键字只是对编译器的建议,编译器可以根据自己的 优化策略 自由决定是否内联函数 ;
在 普通函数 声明和定义 位置 前面加上 inline 关键字 ,
- 只是 建议 C 编译器将该函数内联 , 并不强制要求编译器内联函数 ,
- 如果编译器决定不内联函数 , 该 内联函数 作用 等同于 普通函数 ;
最终 内联函数 是否内联成功 , 由 编译器 决定 ;
二、内联函数 与 宏代码片段对比
1、内联函数
" 内联函数 " 的 本质是 函数 , 其是一种 特殊的函数 ;
" 内联函数 " 有 普通函数 的特征 , 即 :
- 定义时 有 函数名 , 参数列表 , 返回值类型 , 函数体 ;
- 执行时 有 参数检查 , 返回值类型检查 ;
内联函数 的 inline 关键字 只是请求 C 编译器 将 该函数进行内联 , 具体 C 是否同意 , 需要根据 C 编译器的优化策略决定 , 可能同意 , 也可能不同意 ;
如果 C 编译器 不同意 内联请求 , 则该 内联函数 就是 普通函数 , 当做 普通函数 进行调用处理 ;
2、宏代码片段
" 宏代码片段 " 本质 是 宏定义 ;
宏代码片段 是由 预处理器 进行处理 , 执行的操作是 简单的文本替换 ;
宏代码片段 不是函数 , 没有函数那么强大的功能 , 执行时不会进行 参数和返回值 的类型检查 , 没有编译的过程 ;