aks*_*aks 7 memory memory-management
内存段 - BSS,堆栈,堆,数据,代码/文本(还有吗?).
假设我有128MB RAM,有人可以告诉我:
为每个内存段分配了多少内存?
他们从哪里开始?请详细说明地址范围或类似内容.
哪些因素影响应该从哪里开始?
该问题取决于使用的变量数量.既然你没有指定什么编译器或语言甚至操作系统,那就很难确定了!这一切都取决于负责应用程序内存管理的操作系统.简而言之,这个问题没有明确的答案,想想这个,运行时的编译器/链接器,请求操作系统分配一块内存,该分配取决于它们有多少变量,它们有多大,变量的范围和用法.例如,这个简单的C程序,在一个名为的文件中simpletest.c:
#include <stdio.h>
int main(int argc, char **argv){
int num = 42;
printf("The number is %d!\n", num);
return 0;
}
假设环境是基于Unix/Linux的,并且编译如下:
gcc -o simpletest simpletest.c
如果您要在二进制映像上发出objdump或,您将看到可执行文件的各个部分,在本例中为"bss","text".记下这些部分的大小,现在添加一个上面的代码,重新编译并重新发布或者,你会发现该部分已经出现 - 为什么?因为我们添加了一个int类型的变量,包含100个元素.nmsimpletestint var[100];objdumpnmdata
这个简单的练习将证明这些部分增长,因此二进制文件变得更大,并且它还将证明你无法预先确定将分配多少内存,因为运行时实现因编译器和操作系统以及操作系统而异.
简而言之,操作系统调用了内存管理的镜头!