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语言调用约定中,形参内存清理谁开辟谁清理。

函数调用流程:

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

3.c++中带默认值的函数
针对形参的默认值进行分析。
在这里插入图片描述
形参默认值:一定要沿着形参列表从右向左依次给值。
通过多个声明,最后分析得到的为
Compare(int a = 10, int b = 10, int c = 10);
在这里插入图片描述
默认值只能赋值一次。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值