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个字节.
Cal*_*leb 11
因此,如果我们可以打印函数的地址,这意味着该函数存在于内存中并占用其中的一些空间.
是的,您编写的函数将编译为存储在内存中的代码.(在解释语言的情况下,代码本身保存在内存中并由解释器执行.)
那么它在内存中占据了多少空间?
内存量完全取决于功能.你可以写一个很长的函数或很短的函数.长的将需要更多的内存.用于代码的空间通常不是您需要担心的事情,除非您在具有严重内存限制的环境中工作,例如在非常小的嵌入式系统上.在具有现代操作系统的台式计算机(甚至移动设备)上,虚拟内存系统将根据需要将代码页移入或移出物理内存,因此代码消耗的可能性也很小.很多记忆.
当然,它占用了内存空间,一旦执行,整个程序就会加载到内存中。通常,程序指令存储在内存空间的最低字节中,称为text section。您可以在这里阅读有关此内容的更多信息:http : //www.geeksforgeeks.org/memory-layout-of-c-program/