虚拟地址空间

虚拟地址空间:

(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只要栈的剩余空间大于所申请空间,系统为其提供内存,否则,报异常提示栈出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值