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