c/c 参数入栈顺序和参数计算顺序
时间:2021-08-19 16:06:05
手机看文章
扫描二维码
随时随地手机看文章
[导读]关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥如果大家细心的话应该知道c/c语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序与压栈顺序。参数入栈顺序c/c中规定了函数参数的压栈顺序是从右至左,函数调用协议会影响函数参数的入栈方式...
关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥
如果大家细心的话应该知道c/c 语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序与压栈顺序。
官方详解可见:https://msdn.microsoft.com/en-us/library/984x0h58(v=vs.120).aspx通常情况下c/c 默认入栈方式
如果大家细心的话应该知道c/c 语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序与压栈顺序。
参数入栈顺序
c/c 中规定了函数参数的压栈顺序是从右至左,函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、编译器函数名的修饰规则等。参数传递和命名约定
Visual C/C 编译器支持以下调用约定。关键字 | 堆栈清理 | 参数传递 |
---|---|---|
__cdecl | Caller | 以相反的顺序(从右到左)将参数压入堆栈 |
__clrcall | n/a | 按顺序(从左到右)将参数加载到 CLR 表达式堆栈 |
__stdcall | Callee | 以相反的顺序(从右到左)将参数压入堆栈 |
__fastcall | Callee | 存储在寄存器中,然后压入堆栈 |
__thiscall | Callee | 压入堆栈;此指针存储在 ECX 中 |
__vectorcall | Callee | 存储在寄存器中,然后以相反的顺序(从右到左)压入堆栈 |
:__cdel
,也就是以右到左将参数压入堆栈,Windows api使用的是__stdcall
方式,__fastcall
适用于对性能要求较高的场合。自定义参数入栈形式
当然我们也可以自定义函数的入栈顺序,常用形式如下//函数返回值 入栈规则 函数名(参数类型 参数名);
int __cdecl get_name_index(const std::string