社区
Windows Server
帖子详情
1.堆和栈的区别是什么?(最好有图示)
songdandany
2010-05-05 05:10:11
2. struts在程序中起什么作用?
...全文
148
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
打赏
举报
回复
不是很清楚,就自己以往的理解大致乱说下,不要被误导:
堆和栈对用户而言,只有先进先出和后进先出这个使用上的区别,反正都是一块内存内间
堆和栈对系统而言,不仅是使用方式上的区别,更重要的是存放位置是不同的,也即给程序分配的内存空间时,堆和栈存是存放在内存上不同的位置的
堆
和
栈
的
区别
堆
(Heap)与
栈
(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,
堆
与
栈
代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,
堆
与
栈
表示两种内存管理方式; (2)数据结构场景下,
堆
与
栈
表示两种常用的数据结构。 1.程序内存分区中的
堆
与
栈
1.1
栈
简介
栈
由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的
栈
。参考如下代码: int main() { int b; //
栈
char s[] =
栈
和
堆
的
区别
栈
和
堆
的
区别
前面已经介绍过,
栈
是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。
堆
是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。
栈
和
堆
的主要
区别
有以下几点: (1)管理方式不同。
栈
编译器自动管理,无需程序员手工控制;而
堆
空间的申请释放工作由程序员控制,容易产生内存泄漏。对于
栈
来讲,是由编译器自动管理,无需...
c++中
堆
和
栈
的
区别
堆
和
栈
的
区别
JVM——
栈
和
堆
概述,以及有什么
区别
?
从英文单词角度来说
栈
:stack
堆
:heap从数据结构角度来说
栈
和
堆
一样:都是先进后出,后进先出的数据结构从 JVM 内存空间结构角度来说
栈
:通常指 Java 方法
栈
,存放方法每一次执行时生成的
栈
帧。
堆
:JVM 中存放对象的内存空间。包括新生代、老年代、永久代等组成部分。
堆
和
栈
区别
堆
区和
栈
区:程序运行时的内存区域 我们把内存分为
堆
空间和
栈
空间。
栈
空间比较小,但是读取速度快
堆
空间比较大,但是读取速度慢 1.
栈
区
栈
的特征: 数据只能从
栈
的顶端插入和删除 把数据放入
栈
顶称为入
栈
(push) 从
栈
顶删除数据称为出
栈
(pop) 简单地说:先进后出 2.
堆
(区分数据结构中
堆
(Top k)二者没有任何关系)
堆
是一块内存区域,与
栈
不同,
堆
里的...
Windows Server
6,873
社区成员
177,929
社区内容
发帖
与我相关
我的任务
Windows Server
Windows 2016/2012/2008/2003/2000/NT
复制链接
扫一扫
分享
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章