函数参数推送顺序

时间:2010-10-27 09:03:43

标签: c++ c function-calls

为什么函数参数按从右到左的顺序被压入堆栈?

2 个答案:

答案 0 :(得分:16)

使用可变数量的参数(如printf)启用函数的存在。该函数可以提取前一个或两个参数,然后使用它们的值来推断堆栈上的参数总数。

答案 1 :(得分:8)

唯一的原因是可变函数:从堆栈中弹出的第一个参数是函数的“已知”参数,它可以从中确定它应该从堆栈中读取多少个其他参数。

请注意,为了使其工作正常,在这样的调用约定中,堆栈清理留给调用者,它知道它在堆栈上推送了多少个参数。这比callee-cleanup效率稍差,因为清理代码必须在每次函数调用之后写入,而在调用不允许可变参数函数的约定时,它可以嵌入到每个函数的末尾。

除此之外,没有特别的理由,实际上有几个调用约定(例如PascalBorland Fastcall)不允许可变参数函数并从左到右推送参数。