社区
新手乐园
帖子详情
堆内存和栈内存各有什么作用
han6688
2007-05-09 10:36:03
我的问题是堆内存和栈内存各有什么作用?什么变量在堆内存里存放,什么变量在栈内存里存放,各有什么好处?谢谢
...全文
1841
8
打赏
收藏
堆内存和栈内存各有什么作用
我的问题是堆内存和栈内存各有什么作用?什么变量在堆内存里存放,什么变量在栈内存里存放,各有什么好处?谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xuminggood12
2009-03-10
打赏
举报
回复
谢谢深受启发
shaojieli
2007-05-09
打赏
举报
回复
堆内存除了手动释放或程序退出外,内存空间一直被保护,栈内存只要生命期结束,内存空间就不被保护。
堆内存存放动态申请的变量(new),栈内存存放局部变量。
wangzhangyong411
2007-05-09
打赏
举报
回复
日月经贴。。。
wanghao2979
2007-05-09
打赏
举报
回复
月经贴...
fengdream
2007-05-09
打赏
举报
回复
日经贴...
believefym
2007-05-09
打赏
举报
回复
动态申请的放在堆上,需要手动释放
winner8080
2007-05-09
打赏
举报
回复
堆和栈的区别经常考到
星羽
2007-05-09
打赏
举报
回复
堆和栈的区别
一般认为在c中分为这几个存储区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静
态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分
配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪
里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,
不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,
函数中的"adgfdf"这样的字符串存放在常量区。
比如:
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc";栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"12345
6"优化成一块。
}
还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。
栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和
递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有
的栈空间。栈是由编译器自动管理的,不用你操心。
堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。
并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时
是寻找匹配的内存的。而用栈则不会产生碎片。
在栈上存取数据比通过指针在堆上存取数据快些。
一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。
堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念
都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。
在具体的C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示
,栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。
具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现
在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。
这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支
持的数据类型,并不直接支持其他的数据结构。因为栈的这种特点,对栈的使用在程序
中是非常频繁的。对子程序的调用就是直接利用栈完成的。机器的call指令里隐含了把
返回地址推入栈,然后跳转至子程序地址的操作,而子程序中的ret指令则隐含从堆栈中
弹出返回地址并跳转之的操作。C/C++中的自动变量是直接利用栈的例子,这也就是为什
么当函数返回时,该函数的自动变量自动失效的原因(因为 颜换指戳说饔们暗 状态)。
和栈不同,堆的数据结构并不是由系统(无论是机器系统还是操作系统)支持的,而是由
函数库提供的。基本的malloc/realloc/free函数维护了一套内部的堆数据结构。当程序
使用这些函数去获得新的内存空间时,这套函数首先试图从内部堆中寻找可用的内存空
间,如果没有可以使用的内存空间,则试图利用系统调用来动态增加程序数据段的内存
大小,新分配得到的空间首先被组织进内部堆中去,然后再以适当的形式返回给调用者
。当程序释放分配的内存空间时,这片内存空间被返回内部堆结构中,可能会被适当的
处理(比如和其他空闲空间合并成更大的空闲空间),以更适合下一次内存分配申请。这
套复杂的分配机制实际上相当于一个内存分配的缓冲池(Cache),使用这套机制有如下若
干原因:
1. 系统调用可能不支持任意大小的内存分配。有些系统的系统调用只支持固定大小及其
倍数的内存请求(按页分配);这样的话对于大量的小内存分类来说会造成浪费。
2. 系统调用申请内存可能是代价昂贵的。系统调用可能涉及用户态和核心态的转换。
3. 没有管理的内存分配在大量复杂内存的分配释放操作下很容易造成内存碎片。
堆和栈的对比
从以上知识可知,栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活
;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低
。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一
。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编
译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配
无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是
不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回
系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
可以放一块思考
堆和栈的生长方向恰好相反,
|--------------| 低地址
| 堆 |
|--------------|
| | |
| I |
| |
| ^ |
| 栈 | 高地址
-----------------
所以计算机中的堆和栈经常时放一块讲的
nod 一般不是必要就不要动态创建,最讨厌把new出来的东西当局部变量用,用万了马上
delete 的做法.
理由
1.栈分配比堆快,只需要一条指令就呢给配所有的局部变量
2.栈不会出现内存碎片
3。栈对象好管理
当然,某些情况下也要那么写,比如
1.对象很大
2.对象需要在某个特定的时刻构造或析够
3.类只允许对象动态创建,比如VCL的大多数类
当然,必须用堆对象时也不能躲避
堆内存
和
栈内存
这两个术语虽然只有一字之差,但是所表达的意义还是有差别的,
堆内存
和
栈内存
的区别可以用如下的比喻来看出:使用
堆内存
就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。使用
栈内存
...
堆内存
和
栈内存
的区别
堆内存
和
栈内存
的区别如下: 1、定义不同
堆内存
是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
栈内存
在函数中定义的一些基本类型的变量和对象的引用变量都...
java
堆内存
和
栈内存
的区别
一段时间之前,我写了两篇文章文章分别是Java的垃圾回收和Java的值传递,从那之后我收到了很多要求解释Java
堆内存
和
栈内存
的邮件,并且要求解释他们的异同点。在Java中你会看到很多堆和
栈内存
的引用,JavaEE书和文章...
java
堆内存
和
栈内存
的区别_java中
栈内存
和
堆内存
有什么区别
栈内存
和
堆内存
的区别:1、
栈内存
用来存放基本类型的变量和引用变量,
堆内存
用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在
堆内存
中。(视频教程推荐:java视频)2、
栈内存
归属...
基础知识篇——
堆内存
和
栈内存
数据结构中的堆和栈 栈 是一种连续储存的数据结构,具有先进后出的性质。 通常的操作有入栈(压栈),出栈和栈顶元素。想要读取栈中的某个元素,就是将其之间的所有元素出栈才能完成。 堆 是一种非连续的树形储存...
新手乐园
33,321
社区成员
41,774
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章