码迷,mamicode.com
首页 > 编程语言 > 详细

C++:程序分段与内存分区

时间:2015-09-30 06:17:35      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

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申请的内存在堆区)

C++:程序分段与内存分区

标签:

原文地址:http://www.cnblogs.com/reasno/p/4847686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!