C++——堆和栈的区别(C++面试)

堆和栈的区别要从两方面来讲:

一、数据结构

1.栈内存是由系统分配,系统释放,以函数为单位进行栈内存分配,函数栈帧、局部变量、形参变量都存储在栈内存上

堆内存是由用户自己分配的,C语言用malloc/free进行申请/释放内存,C++用new/delete进行申请/释放内存,

由于堆需要用户自己管理,因此内存很容易造成泄露,而栈不会。

2.栈的内存分配释放速度快,效率高,内存都是连续的

堆内存的分配释放相对来说效率低一些,内存不一定连续,容易产生内存碎片,但灵活性高

二、虚拟地址空间

首先,我们了解下C++中虚拟地址空间的布局

保留区:保留区也称为不可访问区,用于存储C的库与操作系统相关的函数,只由操作系统调用。

.text指令段:存放指令

.data数据段:已初始化的数据且初始化数据不为零

.bss数据段:未初始化的数据或初始化数据为零

heap堆区:低地址往高地址开辟

共享库

stack栈区:所有函数的活动空间

命令行参数:传递参数

环境变量:可以拿到库的头文件

ZONE_DMA直接内存访问:针对数据流向,不经过寄存器

ZONE_NORMAL常用部分:虚拟空间和内存的映射关系

ZONE_HIGHMEM高端内存:大文件的映射

由上可得:

栈是由高地址像低地址扩展的连续内存,栈的大小一般为2M或者10M

堆是由低地址向高地址扩展的非连续内存,堆的大小影响因素较多,和系统虚拟地址内存的大小有关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值