首先介绍一下普通函数调用的汇编代码,普通函数链接调用要有两点注意的地方,首先是要在符号表里面找到函数地址,函数地址就是函数体中第一条指令的地址,可以认为如果函数只有声明,没有定义,那么在链接阶段会报错,因为编译器是找不到函数地址;第二点要注意传参,将实参的值移入形参中。
未解决:为什么这里的指令代码符号是move不是push啊?
int Add(int x, int y)
{
return x + y;
}
int main()
{
int ret=Add(1, 2);
cout << ret << endl;
}
而内联函数是类似宏函数一样,在编译期间编译器会用函数体替换函数的调用,没有栈帧的开销,也不会有函数的地址,所以内联函数是没办法链接的。因此使用上要注意内联函数定义与声明不能分开写
inline int Add(int a, int b)
{
return a+ b;
}
int main()
{
int ret=Add(1, 2);
cout << ret << endl;
}
如果内联函数的汇编代码不是这样,那么就是配置属性设置的问题
针对vs2022,解决方案
1.右键项目->属性->配置属性->C/C++
2.C/C++目录下常规->调试信息格式改成程序数据库
3..C/C++目录下优化->内联函数扩展改成只适用_inline
内联函数与宏函数的差异:
相比于宏函数,内联函数可以更好地维护,可读性强,写宏函数会出现很多失误的地方,打很多小括号来区分参数与参数之间的关系。
#define Add(x,y) x*y;//错误,宏函数
#define Add(x,y) ((x)*(y));//正确
int main()
{
int ret=Add(1+2, 2);按照第一个宏函数,1+2*2=1+4=5,错误,所以要改写成第二种加了小括号的宏函数
cout << ret << endl;
}
内联说明只是向编译器发出的一个请求,编译器可以忽略这个请求,当内联函数体庞大时,如果进行替换,那么代码量会非常大,所以编译器可以根据自身的设定忽视inline关键字,将内联函数当成普通函数使用。