C++ 笔记:函数堆栈调用&调用约定&形参默认值

1.通过加断点—调试----窗口-----转到反汇编可以查看函数的堆栈调用过程:

#include<stdio.h>
int sum(int lhs, int rhs)
{
    int temp = lhs + rhs;
    return temp;
}
int main()
{
    int a = 10;
    int b = 20;
    int rt = 0;
    rt = sum(a, b);
    return 0;
}

知识点补充:
1.底层对于变量没有使用变量名进行区分而是使用栈底指针偏移量进行区分。
2.等号是右结合性,先运算等号的右边。
3.对小于8字节的返回值是交给eax寄存器(四字节由一个寄存器,大于4小于8由两个寄存器(eax,edx)带回),由eax寄存器将返回值带回
大于8字节由临时量把值带回来,临时量的地址记录在eax寄存器中,是由临时量带回的。
4.函数传参:压入实参的值,压入顺序(从右向左压)
5.c语言调用约定中,形参内存清理谁开辟谁清理。

函数调用流程:

C++ 笔记:函数堆栈调用&调用约定&形参默认值
2.函数的调用约定
调用约定:是一个调用规范,约定了一些调用规则。
1.约束了符号的生成。
2.约束了入栈顺序(c/c++体系所有的调用约定入栈顺序都是从右向左,其他语言会有改变)。
3.约束了形参内存的栈帧开辟和清理。
1._cdcel
c标准的调用约定,所有c++中的全局函数或者普通函数都是_cdcel的调用约定。
形参栈帧开辟由调用方开辟,清理由调用方。
2._stdcall
Windows的标准调用约定
C++ 笔记:函数堆栈调用&调用约定&形参默认值
连接时发生符号解析的错误,sum函数默认的调用约定是_cdcel
外部引用的符号在符号表中存放在undefine区域中。
参数栈帧开辟由调用方开辟,由被调用方清理。
3._fastcall
C++ 笔记:函数堆栈调用&调用约定&形参默认值
前俩个形参是由寄存器带入被调用方,没有内存开辟以后的形参都是与stdcall相同的调用约定。
4._thiscall 只属于c++的成员函数的调用约定

3.c++中带默认值的函数
针对形参的默认值进行分析。
C++ 笔记:函数堆栈调用&调用约定&形参默认值
形参默认值:一定要沿着形参列表从右向左依次给值。
通过多个声明,最后分析得到的为
Compare(int a = 10, int b = 10, int c = 10);
C++ 笔记:函数堆栈调用&调用约定&形参默认值
默认值只能赋值一次。