C中的函数调用需要多少个机器指令?

时间:2011-03-25 16:03:14

标签: c performance gcc instructions machine-language

我想知道从开始到结束使用gcc为x86平台编译的C程序中函数调用需要多少指令。

4 个答案:

答案 0 :(得分:3)

  • 写一些代码。
  • 编译它。
  • 看一下反汇编。
  • 计算说明。

当你改变参数的数量和类型,调用约定等时,答案会有所不同。

答案 1 :(得分:1)

这是一个非常棘手的问题,很难回答,而且可能会有所不同。

首先,在调用者中需要传递参数,具体取决于类型的变化,在大多数情况下,每个参数都有一个 push 指令。

然后,在被调用的过程中,第一条指令将是为局部变量进行分配。这通常在3个操作中完成:

PUSH EBP
MOV EBP, ESP
SUB ESP, xxx

之后您将拥有该功能的汇编代码。

在代码之后但返回之前,将恢复ebp和esp:

MOV ESP, EBP
POP EBP

最后,您将有一个 ret 指令,根据调用约定,它将处理堆栈的参数,或者将其留给调用者。如果 RET 分别带有数字作为参数或参数为0,则可以确定此项。如果参数为0,则在 CALL 指令后,您将在调用者中有 POP 指令。

答案 2 :(得分:1)

我希望至少有一个

CALL Function

当然,除非内联。

答案 3 :(得分:1)

如果您使用-mno-accumulate-outgoing-args-Os(或-mpreferred-stack-boundary=2或者64位上的3),则每个参数字大小的参数的开销正好是push ,一个call和一个add在返回后调整堆栈指针。

没有-mno-accumulate-outgoing-args并且默认的16字节堆栈对齐,gcc生成的代码速度大致相同,但大约是函数调用的五倍,这是没有充分理由的。