为什么参数按此顺序放在堆栈上

时间:2015-03-05 06:19:27

标签: c#

当调用者将参数放入堆栈中的函数时,会添加参数 以相反的顺序,最后一个参数在堆栈上最高,第一个参数 最低的堆栈。然后被调用者使用基指针访问这些参数, 第一个参数最接近基指针。为什么参数放在上面 按此顺序堆叠?

1 个答案:

答案 0 :(得分:0)

回答这个问题:按惯例(这就是为什么它们被称为“调用约定”)。我不知道其他原因。

大多数编译器(至少在x86中)会将它们从右向左推送。他们也可以从左到右(或随机)这样做,但这根本不会提高性能(或其他任何东西)。

还有FASTCALL调用约定,它会尝试通过将访问量最多的参数直接放在寄存器而不是堆栈中来优化(其他不适合寄存器的参数仍会从右边推送到留在堆栈中。)

“原始”fastcall是通过将前2个(在x86中为x64,如果我记得正确)发送到寄存器中来完成的......但我相信(我可能错了)C#做了一些额外的事情优化以确定哪些是访问最多的那些并使用那些而不是“前两个”。