3.17 内联函数

3.17 内联函数

内联函数是指在调用简单函数时能够提高运行效率的一种机制,内联函数的实现是由编译器来帮我们实现的,当我们编写一个内联函数时,表面看起来像一个内联函数,但在运行过程中编译器并不通过转子函数返回的过程。

3.17.1 内联函数语法规性

内联函数声明时使用关键字inline,这个关键字是对编译器的一个建议,建议编译器在编译的时候仅使用函数体中的语句替换函数调用表达式,也就是说有些函数短而简单不值得开销,编译时在调用处用函数体进行替换节省了参数传递,控制转移等开销。

注意

内联函数必须是短小而且简单

  1. 内联函数体内不能有循环语句和Switch语句
  2. 内联函数的定义必须出现在内联函数第一次被调用之前出现即编译器在解决内联函数体代码替换调用表达式前要见到过内联函数
  3. 对内联函数不能进行异常接口声明
  4. inline只是对编译器的建议,具体执行编译器有自己的判断逻辑
3.17.2 内联函数应用举例
c++ 复制代码
#include <iostream>
using namespace std;
const double PI = 3.1415926;
inline double calArea(double radius) {
	return PI * radius * radius;
}
int main() {
	double r = 3.0;
	double area = calArea(r);
	cout << area << endl;
	return 0;
}

其对应的汇编

assembly 复制代码
--- E:\C++\C++\3_15.cpp --------------------------------------------------------
     7: int main() {
00007FF60DCB1950 40 55                push        rbp  
00007FF60DCB1952 57                   push        rdi  
00007FF60DCB1953 48 81 EC 28 01 00 00 sub         rsp,128h  
00007FF60DCB195A 48 8D 6C 24 20       lea         rbp,[rsp+20h]  
00007FF60DCB195F 48 8D 0D 24 07 01 00 lea         rcx,[__41E36F6C_3_15@cpp (07FF60DCC208Ah)]  
00007FF60DCB1966 E8 14 FA FF FF       call        __CheckForDebuggerJustMyCode (07FF60DCB137Fh)  
00007FF60DCB196B 90                   nop  
     8: 	double r = 3.0;
00007FF60DCB196C F2 0F 10 05 3C 82 00 00 movsd       xmm0,mmword ptr [__real@4008000000000000 (07FF60DCB9BB0h)]  
00007FF60DCB1974 F2 0F 11 45 08       movsd       mmword ptr [r],xmm0  
     9: 	double area = calArea(r);
00007FF60DCB1979 F2 0F 10 45 08       movsd       xmm0,mmword ptr [r]  
00007FF60DCB197E E8 8C F6 FF FF       call        calArea (07FF60DCB100Fh)  
00007FF60DCB1983 F2 0F 11 45 28       movsd       mmword ptr [area],xmm0  
    10: 	cout << area << endl;
00007FF60DCB1988 F2 0F 10 4D 28       movsd       xmm1,mmword ptr [area]  
00007FF60DCB198D 48 8B 0D DC E7 00 00 mov         rcx,qword ptr [__imp_std::cout (07FF60DCC0170h)]  
00007FF60DCB1994 FF 15 BE E7 00 00    call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF60DCC0158h)]  
00007FF60DCB199A 48 8D 15 9B F6 FF FF lea         rdx,[std::endl<char,std::char_traits<char> > (07FF60DCB103Ch)]  
00007FF60DCB19A1 48 8B C8             mov         rcx,rax  
00007FF60DCB19A4 FF 15 A6 E7 00 00    call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF60DCC0150h)]  
00007FF60DCB19AA 90                   nop  
    11: 	return 0;
00007FF60DCB19AB 33 C0                xor         eax,eax  
    12: }
00007FF60DCB19AD 48 8D A5 08 01 00 00 lea         rsp,[rbp+108h]  
00007FF60DCB19B4 5F                   pop         rdi  
00007FF60DCB19B5 5D                   pop         rbp  
00007FF60DCB19B6 C3                   ret  
--- 无源文件 -----------------------------------------------------------------------
相关推荐
_Twink1e5 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
dong_junshuai6 小时前
每天一个开源项目#87 fmt:24.5K Stars 的 C++ 格式化核心
c++·开源·github
雪的季节7 小时前
Multisim14.0的详细中文安装步骤【附安装包】
c++
Persistent的粽子!8 小时前
C++:类与对象(二)
开发语言·c++
蒸蒸yyyyzwd8 小时前
cpp 选手备战秋招学习笔记 day23
c++·求职招聘
.YM.Z8 小时前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
mengzhi啊10 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
HugoStudio_SWAN10 小时前
洛谷 P1319 / P1320 压缩技术——同一枚硬币的正反面
c++·学习·程序人生·算法
小小晓.11 小时前
C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板
c++·单例模式
j7~12 小时前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史