标签:
1. 进程分段
bss段(bss segment):存放未初始化(或者说是zero-initialization,详见C/C++对象初始化相关)的全局对象,属于静态内存分配.(bss全称为"Block Started by Symbol")
data段(data segment):存放已经初始化的全局对象,属于静态内存分配.
栈(stack):存放函数内创建的局部对象(static对象属于全局对象),主要属于静态内存分配,C的alloca函数也用于支持动态内存分配.
堆(heap):存放动态分配的对象(例如C的malloc分配的内存,以及C++的new分配的内存),属于动态分配.
代码段(code segment/text segment):存放程序代码(权限通常被设为只读),也可能包含一些常量.可允许多个进程同时访问同一块代码.
rdata段:存放只读信息.
参考自(http://blog.csdn.net/dyllove98/article/details/9314993)
编译→链接→运行过程中地址的变化过程:
编译:为当前文件中已定义的符号确定偏移地址,生成目标文件(此过程将相关信息记录在导出符号表,未解决符号表,地址重定向表中)
链接:将所有目标文件的相同段合并,并结合各个目标文件的导出符号表,未解决符号表,地址重定向表确定所有名字的虚拟地址.
运行:进行进程虚拟地址到内存物理地址的映射.
2. 物理内存分区
栈:存放函数的局部对象,函数调用时为局部对象分配内存,并在函数返回时(弹栈),由系统回收内存.
堆:存放动态分配的内存,使用malloc或new等分配,由程序员手动释放(free或delete).
全局/静态区:存放全局对象,程序加载时即为全局对象分配内存,直到程序结束才由系统回收内存.
常量区:存放常量,其内存在程序结束后由系统回收.
代码区:存放代码指令.
(另外一种内存分区说法提到一个"自由存储区",认为malloc申请的内存在自由存储区,而new申请的内存在堆区)
标签:
原文地址:http://www.cnblogs.com/reasno/p/4847686.html