功能占用内存空间吗?

kev*_*mes 14 c memory function

void demo()
{
    printf("demo");
}

int main()
{
    printf("%p",(void*)demo);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印了函数的地址demo.
因此,如果我们可以打印函数的地址,这意味着该函数存在于内存中并占用其中的一些空间.
那么它在内存中占据了多少空间?

cni*_*tar 19

您可以使用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>:
Run Code Online (Sandbox Code Playgroud)

编辑

我拿了你的代码并编译(但没有链接!)它.使用objdump您可以看到编译器列出要运行的代码的实际方式.在一天结束时,没有一个功能:对于CPU而言,它只是跳转到某个位置(在此列表中恰好标记了).因此"函数"的大小是包含它的代码的大小.


似乎有些混淆,这在某种程度上不是"真正的代码".这是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   
Run Code Online (Sandbox Code Playgroud)

这是完全相同的代码,具有完全相同的大小,由链接器修补以使用实际地址.gdb以十进制打印偏移量,同时objdump使用更有利的十六进制.如您所见,在这两种情况下,大小为21个字节.

  • 一些解释会有所帮助 (2认同)

Cal*_*leb 11

因此,如果我们可以打印函数的地址,这意味着该函数存在于内存中并占用其中的一些空间.

是的,您编写的函数将编译为存储在内存中的代码.(在解释语言的情况下,代码本身保存在内存中并由解释器执行.)

那么它在内存中占据了多少空间?

内存量完全取决于功能.你可以写一个很长的函数或很短的函数.长的将需要更多的内存.用于代码的空间通常不是您需要担心的事情,除非您在具有严重内存限制的环境中工作,例如在非常小的嵌入式系统上.在具有现代操作系统的台式计算机(甚至移动设备)上,虚拟内存系统将根据需要将代码页移入或移出物理内存,因此代码消耗的可能性也很小.很多记忆.

  • "设立和落泪"是误导.一个好的编译器会将一个带有`void`返回类型的空函数编译成一个`ret`指令(或类似的). (7认同)
  • @kevingomes:通过使用函数指针引用函数,编译器无法优化函数,并且必须包含一个在最终代码中设置和删除的函数.通过引用该函数,您可以强制编译器包含它. (6认同)
  • `(在解释语言的情况下,代码本身保存在内存中并由解释器执行.)`这不是严格正确的,大多数现代语言编译为**某种低级字节码而不是存储文本或内存中的AST. (2认同)

Jos*_*ino 5

当然,它占用了内存空间,一旦执行,整个程序就会加载到内存中。通常,程序指令存储在内存空间的最低字节中,称为text section。您可以在这里阅读有关此内容的更多信息:http : //www.geeksforgeeks.org/memory-layout-of-c-program/