void demo()
{
printf("demo");
}
int main()
{
printf("%p",(void*)demo);
return 0;
}
上面的代码打印出函数demo
的地址。
所以如果我们可以打印出一个函数的地址,那就意味着这个函数存在于内存中并且占用了其中的一些空间。
那么它在内存中占用了多少空间呢?
最佳答案
您可以使用 objdump -r -d
自己查看:
0000000000000000 <demo>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
5: R_X86_64_32 .rodata
9: b8 00 00 00 00 mov $0x0,%eax
e: e8 00 00 00 00 callq 13 <demo+0x13>
f: R_X86_64_PC32 printf-0x4
13: 5d pop %rbp
14: c3 retq
0000000000000015 <main>:
编辑
我获取了您的代码并编译(但未链接!)它。使用 objdump
您可以看到编译器布置要运行的代码的实际方式。归根结底,没有函数这样的东西:对于 CPU 来说,它只是跳转到某个位置(在此 list 中恰好被标记)。所以“函数”的大小就是包含它的代码的大小。
似乎有些混淆,这不是“真正的代码”。 GDB 是这样说的:
Dump of assembler code for function demo:
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: mov $0x400614,%edi
0x0000000000400536 <+9>: mov $0x0,%eax
0x000000000040053b <+14>: callq 0x400410 <printf@plt>
0x0000000000400540 <+19>: pop %rbp
0x0000000000400541 <+20>: retq
这是完全相同的代码,大小完全相同,由链接器修补以使用真实地址。 gdb
以十进制打印偏移量,而 objdump
使用更有利的十六进制。如您所见,在这两种情况下,大小都是 21 字节。
关于c - 函数是否占用内存空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21735407/