C++内存分配的机制

对于C++内存分配虽然都有了解,但在实际复习后发现仍有一些细节没有搞清楚,这里做个总结并方便后期查看。

C++将内存分为栈,堆,全局/静态存储区,常量存储区和代码区。

其中局部变量存储在栈区,不过栈的空间有限,不过系统会自动释放其空间,避免了内存泄漏和溢出。优点是速度快,效率高,因为有专门的寄存器处理。栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高

堆空间大,使用new分配,但是需要手动释放内存,否则会造成内存溢出和泄露。速度比起栈分配来讲慢了不少,因为它是C++函数库提供的函数,处理机制比较复杂,需要去寻找剩余的空间来分配内存,类似链表的处理。要注意一点是堆都是动态分配。

全局/静态存储区:全局的变量和定义的静态变量在这个区中,对于静态变量本身C++中除了定义的全局静态变量外(只有本文件内有效,其他文件是隐藏的。在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用)。在类中定义的静态变量只属于此类,可以被类的对象去掉用。但不属于任何类。这跟类中的成员函数有相似的机制。

常量存储:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。

代码区:存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。

 

内存模型组成部分:自由存储区,动态区、静态区;

根据c/c++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即:自由存储区,动态区、静态区。

自由存储区:局部非静态变量的存储区域,即平常所说的栈;

动态区: 用new ,malloc分配的内存,即平常所说的堆;

静态区:全局变量,静态变量,字符串常量存在的位置;

注:代码虽然占内存,但不属于c/c++内存模型的一部分;

 

至于为什么要对内存分这些区,原因在于:

#代码是根据流程依次执行的,一般只需要访问一次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间。
#未初始化数据区在运行时放入栈区中,生命周期短。
#全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。
#堆区由用户自由分配,以便管理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值