c - 函数是否占用内存空间?

标签 c function memory

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/

相关文章:

c - 为什么我在不是结构或 union 的东西中得到 ' request for member ‘******’?

在 Windows 上使用 Tiny C Compiler 编译并运行 file.c

string - bash 函数不会解析最后两个参数

c - 中断正在线程中执行的函数调用

exception - C++中抛出异常后应该如何释放内存?

c - 如何使用函数指针执行算术运算?

c - "SIGSEGV on thread"错误

python - 我正在写一个函数来查找数字是否是回文。它在第2行给了我一个运行时错误,这是函数定义的行[closed]

C语言,字符数组已损坏(?)

python - Pandas 内存使用不一致