函数参数推送顺序

Raj*_*pal 9 c c++ function-calls

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

Eug*_*ith 17

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

  • 我应该提一下,C标准中没有任何内容需要这个(事实上,我认为它甚至不需要一个堆栈).您可以轻松地将它们按顺序推送到其他顺序,然后进行计数,这样您就可以找到第一个(虽然实现的是脑死亡).因为你是对的,所以不要把这当作批评你的答案.+ 1. (9认同)

Mat*_*lia 8

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

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

除此之外,没有特别的理由,事实上有几个调用约定(例如Pascal,Borland Fastcall)不承认可变参数函数并从左到右推送参数.