该函数需要多少字节?

时间:2011-12-02 21:13:06

标签: c

int main(){
   int i;
}

我在调用函数后在gdb中做$ebp-$esp它给了我4.但是旧ebp呢?我可以认为这个函数在堆栈上需要8个字节吗? int为4个字节,旧ebp为4个字节。

注意 - 我使用-mpreferred-stack-boundary=2 -march=i386

构建了它

3 个答案:

答案 0 :(得分:1)

完全取决于编译器如何决定优化函数。一些优化编译器可能会将此函数构建为“main: ret”的行,导致它根本不使用堆栈空间。

答案 1 :(得分:1)

假设您在没有优化的情况下进行编译,那么您不会计算旧的ebp,因为在将旧的ebp推入堆栈后,esp会被复制到ebp。我认为你所看到的是gcc节省ecx,虽然我不知道为什么会这样做。

答案 2 :(得分:0)

该函数需要多少内存将完全取决于您正在使用的编译器。这是使用gcc 4.6.2和编译命令反汇编上面的代码:

gcc -mpreferred-stack-boundary=2 -march=i386 -m32 -o test test.c

   0x08048394 <+0>: push   ebp
   0x08048395 <+1>: mov    ebp,esp
   0x08048397 <+3>: pop    ebp
   0x08048398 <+4>: ret

显而易见的是i被忽略,因为根本没有使用它。因此,堆栈中有4个字节用于call推送的返回地址,另外4个用于保留ebp

正如您所期望的那样,如果您使用-O1编译标志启用了轻微优化,则会变为:

   0x08048394 <+0>: ret

由于根本不需要堆栈帧,main什么都不做。