虚拟地址空间:
(1).text代码段:存放程序执行的一块内存区域,此区域大小在运行之前就已经确定下来了。
(2).data数据段:(全局初始化数据区/静态数据区)只初始化一次,指用来存放程序中已初始化的全局变量的一块内存区域(已经初始化的全局变量、静态变量和常量)
(3).bss未初始化数据区:用来存放程序中未初始化的全局变量的一块内存区域,属于静态内存分配,程序开始就将其清零了。
(4)heap区:程序员管理
(5)stack区:存参数,局部变量的值以及进行任务切换时存放任务的上下文
Eg:
text和data段都在可执行文件中,由系统可从可执行文件中加载,而BSS段不在可执行文件中,由系统初始化的段只保存没有值的变量,事实上并不惜要保存这些变量的映像,运行时所需bss段大小记录在目标文件中,但是bss段并不占据目标文件的内存空间
堆栈的区别:
(1)管理方式:heap资源由程序员控制,stack由编译器自动管理
(2)空间大小:一般32位系统,heap可以达到4G,stack有一定的大小空间,大约1M
(3)生长方向:heap向上增长(内存增加),stack相反
(4)分配方式:heap动态分配,stack有静态分配也有动态分配,静态分配有编译器完成,动态分配由alloc函数分配,但是栈的给他发票由编译器进行释放,无需程序员实现
(5)碎片问题:heap频繁new/delete势必会造成内存空间的不连续,从而造成大量的随便,效率低,栈是先进后出的队列,一一对应,永远不可能有一个内存块从栈中间弹出来
(6)分配效率:栈是机器系统提供的数据结构,计算机会从底层上支持栈这个结构,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,因此栈的效率高,堆是C/C++库函数提供的,机制复杂,有一定的算法,所以效率低
(7)系统响应:heap,系统中有一个记录空闲内存地址的链表,当系统收到程序申请时,遍历链表,找第一个空间大于申请空间的堆节点,删除空闲结点链表中该节点,并且将该节点空间分配给程序(大多数系统会在这块内存空间首地址记录本次分配大小,这样才能正确释放),stack只要栈的剩余空间大于所申请空间,系统为其提供内存,否则,报异常提示栈出