堆(heap)与栈(stack)的区别(一)
堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,但它与数据结构中的堆不是一回事,分配方式类似于链表。
栈(stack):由编译器自动分配和释放,存函数的参数值,局部变量等,其操作方式类似于数据结构中的栈。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。
文字常量区:存放常量字符串,程序结束后由系统释放。
程序代码区:存放函数的二进制代码。
以下是一段实际说明的程序代码:
int a = 0 //全局初始化区
int *p1 //全局未初始化区
main()
{
int b; //栈
char s[] ="abc": //栈
char *p2 ; //栈
char *p3 = "123456"; //123456在常量区,p3在栈上
static int c = 0 //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配的10和20字节的区域就在堆区
strcpy(p1, "123456"); //123456放在常量区,编译器可能会将它与p3所指向的“123456”优化成一个地方。
}
堆与栈的一些区别:
1.申请后的响应:
堆:
操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小。这样,代码中的delete语句就能正确的释放这些内存空间。另外,由于找到的堆节点大小不一定正好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表中。
栈:
只要栈的剩余空间大于申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
2.申请大小的限制:
堆:
堆是向高地址扩展的数据结构,是不连续的内存区域,这是由于系统使用链表存储空闲内存地址的,自然是不连续的。而链表的遍历方式是由低地址向高地址,堆的大小受限于计算机系统中有效的虚拟内存,由此可见,堆获得的空间比较灵活,也比较大。
栈:
在windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域,这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在windows下,栈的大小是2MB(也有说是1MB,总之是一个一个编译时就确定的常数),如果申请的空间超过栈的剩余空间,将提示overflow,因此,能从栈获得的空间比较小。
3.申请效率对的比较:
堆:是由程序员使用new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
栈:由系统自动分配,速度较快,但程序员无法控制。
在wondows下,最好的方式是使用VirtualAlloc分配内存,不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便,但是速度最快,也最灵活。
4.堆和栈中存储的内容:
堆:一般是在堆的头部用一个字节存放堆的大小,堆中的具体内容由程序员安排。
栈:在函数调用时,第一个进栈的是主函数中的下一条命令(函数调用语句的吓一跳可执行语句)地址,然后是函数的各个参数,在大多数C编译器中,参数是由右往左入栈的,然后是函数中的局部变量,静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
5.存取效率:
在栈上的数组比指针所指向的字符串(例如堆)块。
全局变量放在数据段,函数内部变量static int ncount放在数据段,函数内部变量char *p = "AAA",p的位置在堆栈,指向空间的位置为数据段,函数内部变量char *p = new char;,p的位置是在堆栈,指向空间的位置为堆。
对于一个进程的内存空间而言,可以在逻辑上分成三个部分:代码区,静态数据区和动态数据区,动态数据区一般就是“堆栈”。“堆”和“栈”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构,进程的每一个线程都有私有的“栈”,每个线程虽然代码一样,但是本地变量的数据都是互补干扰的。
一个堆栈可以通过“基地址”和“栈顶”地址来描述,全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
demo:
#define <stdio.h>
#define <stdlib.h>
int a = 1024;
int test(int c)
{
static int b[20];
int *p = (int *)malloc(c*sizeof(int));
}
int main()
{
test(a*1024);
return 0;
}
c分布在栈(stack)区,p分布在栈(static)区,但是其分配的字节空间在堆(heap)区,b分布在全局静态初始化区。在windows中,对于一般没有free的malloc,在进程正常结束时是可以回收的,不管用户怎么malloc,在进程结束时,其虚拟地址空间就会被直接销毁,操作系统只需要在进程结束时让内存管理模块吧分页文件中与此进程相关的记录全部删除,标记为“可用空间”,就可以是所有申请的北村都一次性的回收。但是,这里有一个条件,即使进程在退出时才行,这里的回收是在windows操作系统上,其他系统不一定有。
堆(heap)与栈(stack)的区别(一)相关推荐
- bss段,data段、text段、堆heap和栈stack
bss段,data段.text段.堆heap和栈stack bss段 data段 text段 堆(heap) 栈(stack) 例子 在C的学习中,你总避免不了对各类数据的存储区域学习归纳总结,简单的 ...
- JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转发)
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助. 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区: ...
- (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)
文章目录 bss段 data段 text段 堆(heap) 栈(stack) 一个程序本质上都是由 bss段.data段.text段三个组成的. 存储类型总结 bss段 bss段(bss segmen ...
- JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指 ...
- JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)
想想面试的时候很多会问jvm这方面的问题虽然还是菜鸟不太能用到现在但是还是了解一下, 找资料的时候看见个大佬写的很好转载到这方便以后自己复习和给大佬做宣传 以下为大佬的博客原文: 这两天看了一下深入浅 ...
- Java堆(heap)、栈(stack)和队列的区别
Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...
- BSS段 data段 text段 堆heap 和 栈stack
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. ...
- 堆(heap)和栈(stack)有什么区别??
简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 预备知识-程序的 ...
- 堆(heap)和栈(stack)有什么区别
简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 程序的内存分配 ...
- 什么是堆什么是栈以及两者区别特点
什么是堆什么是栈以及两者区别特点 一 英文名称 堆和栈是C/C++编程中经常遇到的两个基本概念.先看一下它们的英文表示: 堆――heap 栈――stack 二 从数据结构和系统两个层次理解 在具体的C ...
最新文章
- 代码缺陷导致 CloudFlare 泄露大量客户站点的密码等私密信息
- excel图片变成代码_三行代码把女朋友照片变成了素描图片!以为我画的!爱我爱的不行...
- linux进程的堆栈空间_代码段(指令,只读)、数据段(静态变量,全局变量)、堆栈段(局部变量)、栈【转】...
- python 怎么样才有output_[学]Python用户手册笔记_4_Input and Output
- 浙大首届人工智能本科生9月入学,纳入竺院图灵班
- 粘性定位(HTML、CSS)
- RT-Thread 4.0 + STM32F407 学习笔记1
- WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?
- 在线购物系统后台登录界面html代码,电子商城(购物网站)html模板源码
- 软件项目管理第十章笔记---项目采购管理
- 我的爬虫(一)之抓取优美图库图片
- long tail(长尾理论)
- win7 计算机无法搜索,Win7电脑搜索功能不能用的解决方法
- SuperMapr测量地图面积
- 棕榈油增仓大涨,铁矿石认购上涨,豆粕09-01季节性正套2022.5.27
- CrateDB三机三节点部署(Docker Overlay网络)
- 与你相关|《个人信息保护法》发布后我们能做什么?
- Ubuntu安装钉钉超简单步骤
- ISO 8601 utc 时间
- arcgis10.8深度学习介绍课程梳理
热门文章
- 第一次使用考试宝进行作业练习
- 第十六届全国大学生智能车竞赛创意组-讯飞智慧餐厅
- 多线程写文件_Shell简单实现多线程
- 批量条形码生成器_条码打印软件之Code32条形码
- 新海诚没有参与制作的作品_下列哪部作品新海诚没有参与制作
- mysql 以时间段分组_根据mysql 按日期或者时间段 分组 统计的查询
- ecdf函数_关于ecdf函数的使用问题
- MarkDown 流程图 ... ...
- 数据包skb_buf(SKB才是套接字的缓冲区)
- 七牛云删除图片接口_图片基本处理(imageView2)