C++深度剖析教程4 --- 内联函数分析

– 作者 Allen 转载请注明出处
微信公众号「炫色Allen」(微信号:Allen5G)

常量和宏的关系
在这里插入图片描述
c++中推荐使用内联函数替代宏代码块
c++使用inline关键字声明内联函数

在这里插入图片描述
内联函数声明inline关键字和函数定义结合在一起,否则编译器会直接忽略内联请求

c++编译器可以讲一个函数进行内联编译
被c++编译器内联编译的函数叫做内联函数
c++编译器直接将函数体插入函数调用的地方
内联函数没有普通函数调用时的额外开销(压栈,跳转。返回)
c++编译器不一定满足函数的内联的要求

4-1 内联函数

#include <stdio.h>
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
inline int func(int a, int b)
{
    return a < b ? a : b;
}
int main(int argc, char *argv[])
{
    int a = 1;
    int b = 3;
    int c = FUNC(++a, b);
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    
    return 0;
}

直接运行结果:预测的是2 3 2
问题是宏代码块是有副作用的,可以使用内联函数

在这里插入图片描述
这个时候使用VS的反汇编功能
在这里插入图片描述
转到反汇编
在这里插入图片描述
汇编代码:

int c = FUNC(++a, b);
012B13AC  mov         eax,dword ptr [a]  
012B13AF  add         eax,1  
012B13B2  mov         dword ptr [a],eax  
012B13B5  mov         ecx,dword ptr [a]  
012B13B8  cmp         ecx,dword ptr [b]  
012B13BB  jge         main+51h (12B13D1h)  
012B13BD  mov         edx,dword ptr [a]  
012B13C0  add         edx,1  
012B13C3  mov         dword ptr [a],edx  
012B13C6  mov         eax,dword ptr [a]  
012B13C9  mov         dword ptr [ebp-0E8h],eax  
012B13CF  jmp         main+5Ah (12B13DAh)  
012B13D1  mov         ecx,dword ptr [b]  
012B13D4  mov         dword ptr [ebp-0E8h],ecx  
012B13DA  mov         edx,dword ptr [ebp-0E8h]  
012B13E0  mov         dword ptr [c],edx

从反汇编可见,实际是没有同意请求的内联函数

vs内部修改方式
在这里插入图片描述

内联函数
c++中首选内联函数,而不是宏代码块
在这里插入图片描述
在这里插入图片描述
4-2 内联函数实例

#include <stdio.h>

//__forceinline   功能是几乎一样的,都是随着程序性能提升诞生的
//__attribute__((always_inline))   //g++提供的强制内联函数
inline   标准c++提供的
int add_inline(int n);

int main(int argc, char *argv[])
{
    int r = add_inline(10);

    printf(" r = %d\n", r);

    return 0;
}

inline int add_inline(int n)
{
    int ret = 0;

    for(int i=0; i<n; i++)
    {
        ret += i;
    }

    return ret;
}

注意事项:仅针对c++中的inline
不过随着技术发展,慢慢下边的都是支持的(主要是面对使用的有可能是很古老的PC)
在这里插入图片描述

小结:主要是随着技术发展

在这里插入图片描述

本文参考狄泰软件学院相关课程,可以加狄泰软件学院群学习 Q群号码:199546072