当前位置:首页 > 公众号精选 > 技术让梦想更伟大
[导读]关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥如果大家细心的话应该知道c/c语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序与压栈顺序。参数入栈顺序c/c中规定了函数参数的压栈顺序是从右至左,函数调用协议会影响函数参数的入栈方式...

关注、星标公众号,直达精彩内容

ID:技术让梦想更伟大

作者:李肖遥


如果大家细心的话应该知道c/c 语言函数参数入栈顺序为从右至左,那么为什么这样呢?来看看两个知识点:参数的计算顺序与压栈顺序。

参数入栈顺序

c/c 中规定了函数参数的压栈顺序是从右至左,函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、编译器函数名的修饰规则等。

参数传递和命名约定

Visual C/C 编译器支持以下调用约定。

关键字堆栈清理参数传递
__cdeclCaller以相反的顺序(从右到左)将参数压入堆栈
__clrcalln/a按顺序(从左到右)将参数加载到 CLR 表达式堆栈
__stdcallCallee以相反的顺序(从右到左)将参数压入堆栈
__fastcallCallee存储在寄存器中,然后压入堆栈
__thiscallCallee压入堆栈;此指针存储在 ECX 中
__vectorcallCallee存储在寄存器中,然后以相反的顺序(从右到左)压入堆栈
官方详解可见:

https://msdn.microsoft.com/en-us/library/984x0h58(v=vs.120).aspx

通常情况下c/c 默认入栈方式:__cdel,也就是以右到左将参数压入堆栈,Windows api使用的是__stdcall方式,__fastcall适用于对性能要求较高的场合。

自定义参数入栈形式

当然我们也可以自定义函数的入栈顺序,常用形式如下

//函数返回值  入栈规则  函数名(参数类型 参数名);
int __cdecl get_name_index(const std::string
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭