在C中,函数调用需要多少机器指令?

在C中,函数调用需要多少机器指令?,c,performance,gcc,instructions,machine-language,C,Performance,Gcc,Instructions,Machine Language,我想知道在使用gcc为x86平台编译的C程序中,从开始到结束,函数调用需要多少指令 写一些代码。 编译它。 看看拆卸。 数一数指令。 答案会随着参数的数量和类型、调用约定等的变化而变化 写一些代码。 编译它。 看看拆卸。 数一数指令。 答案会随着参数的数量和类型、调用约定等的不同而有所不同。这是一个非常棘手的问题,很难回答,而且可能会有所不同 首先,在调用者中需要传递参数,这取决于类型,这会有所不同,在大多数情况下,每个参数都有一个push指令 然后,在被调用的过程中,第一个指令将是对局部变量进

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

写一些代码。 编译它。 看看拆卸。 数一数指令。 答案会随着参数的数量和类型、调用约定等的变化而变化

写一些代码。 编译它。 看看拆卸。 数一数指令。
答案会随着参数的数量和类型、调用约定等的不同而有所不同。

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

首先,在调用者中需要传递参数,这取决于类型,这会有所不同,在大多数情况下,每个参数都有一个push指令

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

PUSH EBP
MOV EBP, ESP
SUB ESP, xxx
之后您将获得函数的汇编代码

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

MOV ESP, EBP
POP EBP

最后,您将得到一条ret指令,根据调用约定,该指令将取消分配堆栈的参数,或者将其留给调用方。您可以确定RET是以数字作为参数,还是参数分别为0。如果参数为0,则调用方在调用指令之后会有POP指令。

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

首先,在调用者中需要传递参数,这取决于类型,这会有所不同,在大多数情况下,每个参数都有一个push指令

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

PUSH EBP
MOV EBP, ESP
SUB ESP, xxx
之后您将获得函数的汇编代码

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

MOV ESP, EBP
POP EBP

最后,您将得到一条ret指令,根据调用约定,该指令将取消分配堆栈的参数,或者将其留给调用方。您可以确定RET是以数字作为参数,还是参数分别为0。如果参数为0,则在CALL指令之后的调用者中将有POP指令。

我希望至少有一条

CALL Function

当然,除非它是内联的。

我希望至少有一个

CALL Function
当然,除非它是内联的。

如果在64位上使用-mno累加传出参数和-Os或-mprefered stack boundary=2或3,则开销正好是每个参数按字大小的参数一次推送、一次调用和一次添加,以在返回后调整堆栈指针

如果不使用-mno累计传出参数,并且使用默认的16字节堆栈对齐方式,gcc生成的代码的速度大致相同,但函数调用的速度大约大五倍,这是没有充分理由的。

如果使用-mno累计传出参数和-Os或-mps堆栈边界=2,或64位上的3,然后,开销正好是每个参数一个字大小的参数、一个调用和一个add,以在返回后调整堆栈指针


如果没有-mno累积传出参数,并且使用默认的16字节堆栈对齐方式,gcc生成的代码的速度大致相同,但函数调用的速度大约大五倍,这是没有充分理由的。

gcc-g test.c、gdb a.out、disas main设置调用的指令有多少?根据呼叫约定,在呼叫方或被呼叫方中设置和清理可能发生的事件?在任何情况下,准确的数字取决于传递的参数数量。@Erik您错过了计数指令步骤-@大卫·赫弗南:说得好。不能假设任何情况:如果编译器决定内联函数gcc-g test.c、gdb a.out、disas main,那么PIt甚至可以是0。设置调用需要多少条指令?根据呼叫约定,在呼叫方或被呼叫方中设置和清理可能发生的事件?在任何情况下,准确的数字取决于传递的参数数量。@Erik您错过了计数指令步骤-@大卫·赫弗南:说得好。不能假设任何东西:如果编译器决定内联函数,PIt甚至可以为0。谁说过参数-谁说了关于参数的事-