社区
Windows Server
帖子详情
1.堆和栈的区别是什么?(最好有图示)
songdandany
2010-05-05 05:10:11
2. struts在程序中起什么作用?
...全文
145
8
打赏
收藏
1.堆和栈的区别是什么?(最好有图示)
2. struts在程序中起什么作用?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
shixiujin
2010-05-05
打赏
举报
回复
[Quote=引用 7 楼 qihuanfengyun 的回复:]
主要的区别由以下几点:
1、管理方式不同;
2、空间大小不同;
3、能否产生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
空间大小:一般来讲在32位系统下,堆内存可以……
[/Quote]
很全了.
qihuanfengyun
2010-05-05
打赏
举报
回复
主要的区别由以下几点:
1、管理方式不同;
2、空间大小不同;
3、能否产生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:
打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。
注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。
虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)
qihuanfengyun
2010-05-05
打赏
举报
回复
[Quote=引用 5 楼 ljc007 的回复:]
google:
搜索 堆和栈的区别 获得约 58,100 条结果
[/Quote]
哦,经常见你这样做。我一般也这么做。
有人说用 百度 对于这么回答严重鄙视。
ljc007
2010-05-05
打赏
举报
回复
google:
搜索 堆和栈的区别 获得约
58,100
条结果
就是just4
2010-05-05
打赏
举报
回复
如是structs,而不是struct,这个只是mvc的一个框架
songdandany
2010-05-05
打赏
举报
回复
SSH3大框架中的其中一个struts在程序中的作用。。
就是just4
2010-05-05
打赏
举报
回复
struct,还是structs,如是前者就是c中的结构,结构简单的理解就是复杂的数据类型,因为数据这东西可大可小,当要把某某东西内部很多的数据整合在一起表述时就成了结构
就是just4
2010-05-05
打赏
举报
回复
不是很清楚,就自己以往的理解大致乱说下,不要被误导:
堆和栈对用户而言,只有先进先出和后进先出这个使用上的区别,反正都是一块内存内间
堆和栈对系统而言,不仅是使用方式上的区别,更重要的是存放位置是不同的,也即给程序分配的内存空间时,堆和栈存是存放在内存上不同的位置的
栈
和
堆
的
区别
本文详细介绍了
栈
和
堆
的
区别
,包括管理方式、空间大小、碎片问题、生长方向、分配方式、分配效率等方面。
栈
由编译器自动管理,效率高但空间小;
堆
由程序员手动控制,空间灵活但易产生碎片、效率低。同时提醒要防止
堆
和
栈
越界,并给出了数据存储区域实例。
堆
和
栈
的
区别
本文详细介绍了程序内存布局中
堆
和
栈
的
区别
,包括管理方式、空间大小、生长方向、分配效率及存放内容。同时,讨论了数据结构中的
堆
和
栈
,阐述了它们作为线性结构的特点和应用场景。
堆
是动态分配内存,适用于大块内存的分配,而
栈
则用于快速存储函数调用时的局部变量。在数据结构中,
堆
是一种特殊的完全二叉树,满足
堆
序性,常用于优先队列等数据组织。
c++中
堆
和
栈
的
区别
本文详细介绍了C/C++中的
堆
和
栈
的
区别
与联系,包括内存分配、申请方式、系统响应、大小限制、效率、存放内容以及存取效率等方面。
堆
通常由程序员分配和释放,
栈
由编译器自动管理。
栈
的效率较高,但空间有限,而
堆
虽然灵活,但分配和释放可能导致碎片。在C中,内存分为
堆
、
栈
、全局区、静态区和常量区;在C++中,内存则分为
堆
、
栈
、自由存储区、全局(静态)存储区和常量存储区。
堆
和
栈
的对比显示,
栈
适合用于快速高效且大小有限制的场景,
堆
则适用于需要更大、更灵活内存的场合。
【C语言】
堆
和
栈
的
区别
本文深入解析了程序内存中
堆
和
栈
的两种管理方式,以及数据结构中
堆
和
栈
的概念。详细对比了它们在内存分配、释放速度、效率及灵活性上的
区别
,同时介绍了
堆
和
栈
在数据结构中的特性和应用。
java
栈
和
堆
的
区别
_Java中
堆
和
栈
的
区别
本文深入解析Java
堆
和
栈
的
区别
,包括内存动态分配、存取速度、对象创建和内存分布。重点讲解了字符串共享实例,以及如何影响内存效率和程序性能。
Windows Server
6,873
社区成员
177,930
社区内容
发帖
与我相关
我的任务
Windows Server
Windows 2016/2012/2008/2003/2000/NT
复制链接
扫一扫
分享
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章