C++的内存机制,程序变成exe执行的过程

C++的内存机制:
C++的内存主要分为以下五个存储区:
栈:主管存储位于函数内的局部变量,由编译器负责分配和释放内存
堆:主管new分配的内存,由程序员delete和delete[]负责释放
自由存储区:由程序员的malloc等分配,由free释放,如果忘记了free,会造成内存泄漏。在程序结束时会由os回收。
全局区/静态区:存放static变量和全局变量,程序编译好便会存在,编译器会自动赋值,程序结束时候释放。
常量存储区:专门存储不能修改的常量。

栈是由代码底层(系统)实现的,有专门的寄存器指向栈所在的地址。
堆是由函数库提供的,基本的提供了malloc、calloc、realloc、free、new、delete维护的一套内部的数据结构。

当程序尝试在堆中获取新的内存空间时,函数会优先从内部堆寻找可用的内存空间,(内存分配算法)
比如首次适应算法,最佳适应算法,最坏适应算法,循环首次适应算法。p163
如果没有可用的内存空间,则尝试通过系统调用动态增加数据段的内存大小,新分配的空间会首先被组织到内部堆,再以适当的形式返回给调用者。
当程序释放分配的内存空间时,这片内存空间被返回到内部堆结构中,可能会被适当的处理(比如空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。 这套复杂的分配机制实际上相当于一个内存分配的缓冲池(Cache),使用这套机制有如下几个原因:

(1)系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其倍数的内存请求(按页分配);这样的话对于大量的小内存分配来说会造成浪费。

(2)系统调用申请内存可能是代价昂贵的。 系统调用可能涉及到用户态和核心态的转换。(就是防止再来一次上面的流程)

(3)没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。

栈和堆的区别:
栈是系统内部提供的功能,堆是函数库(有大量复杂的机制,比如上面举的例子,系统调用动态增加数据段,由调用程序释放后的内存的合并机制)提供的功能
栈处理比较快速,堆处理更慢一点(效率)
栈空间有静态分配和动态分配两种方式,堆空间只有动态分配。
(栈的静态分配由编译器完成,动态分配由malloc实现,且栈的动态分配是不被鼓励的)
堆的分配new,delete容易造成大量内存碎片,栈不会有这个问题,因为栈是一个后进先出的队列。
堆的生长方向是向上的,也是内存地址增加的方向,栈的生长方向是向下的,朝着内存地址减少的方向增长。

程序从源文件到可执行程序的过程:
1.编译,由编译程序将源代码编译成若干目标模块
2.链接,将若干模块和所需的库函数链接再一起,组装成一个完整的装入模块。
3.装入,由装入程序把装入模块装入到内存中执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值