
堆和栈之间的区别
首先,初步知识-程序存储器分配
由c / C ++编译的程序所占用的内存分为以下几部分
1. 堆栈(堆栈)-由编译器自动分配和释放,用于存储函数参数值,局部变量值等. 其操作类似于数据结构中的堆栈.
2. 堆(heap)-通常由程序员分配和释放. 如果程序员不释放它,则操作系统可能会在程序结束时将其恢复. 请注意,它与数据结构中的堆有两个不同之处,分配方法类似于链表,呵呵.
3. 全局区域(静态区域)(静态)-,将全局变量和静态变量的存储放在一起,已初始化的全局变量和静态变量在一个区域中,未初始化的全局变量和未初始化的静态变量在另一个相邻区域中. -程序结束后会有系统发布
4. 文字常量区域-常量字符串放在此处. 程序结束后由系统释放
5. 程序代码区-存储函数体的二进制代码.
应用后的系统响应
堆栈: 只要堆栈的剩余空间大于请求的空间,系统就会为程序提供内存,否则它将报告异常并提示堆栈溢出.
堆: 首先,您应该知道操作系统有一个记录空闲内存地址的链表. 当系统从程序接收到应用程序时,
是
遍历链接列表,找到其空间大于请求的空间的第一个堆节点,然后从空闲节点链接列表中删除该节点,并将该节点的空间分配给程序. 此外,对于大多数系统而言栈空间,系统将位于该块之内
此分配的大小记录在内存空间的第一个地址上,以便代码中的delete语句可以正确释放此内存空间. 另外,由于找到的堆节点的大小不一定等于应用程序的大小
小栈空间,系统会自动将多余的部分放回空闲列表中.
2.3应用程序大小的限制
堆栈: 在Windows下,堆栈是一个扩展为低地址的数据节点
结构是连续的内存区域. 这句话的意思是系统顶部确定了堆栈顶部的地址和堆栈的最大容量. 在WINDOWS下,堆栈的大小为2M(简而言之就是1M)

在编译时确定的常数. 如果请求的空间超过了堆栈上的剩余空间,将提示溢出. 因此,堆栈中的可用空间很小.
堆: 堆是一种数据结构,可以扩展到更高的地址,并且是不连续的内存区域. 这是因为系统使用链接列表来存储空闲内存地址,该地址自然是不连续的,并且链接列表的遍历方向是从低地址到高地址. 堆的大小受计算机系统中可用的虚拟内存限制. 这表明堆获得的空间更加灵活,更大.
2.6访问效率比较
chars1 [] =“ aaaaaaaaaaaaaaaaa”;
char * s2 =“ bbbbbbbbbbbbbbbbbb”;
aaaaaaaaaaaaa在运行时分配;
bbbbbbbbbbb是在编译时确定的;
但是,在以后的访问中,堆栈上的数组比指针所指向的字符串(例如堆)要快.
例如:
#include
voidmain()
{
chara = 1;
charc [] =“ 1234567890”;
char * p =“ 1234567890”;
a = c [1];
a = p [1];
返回;

}
相应的汇编代码
10: a = c [1];
004010678A4DF1movcl,byteptr [ebp-0Fh]
0040106A884DFCmovbyteptr [ebp-4],cl
11: a = p [1];
0040106D8B55ECmovedx,dwordptr [ebp-14h]
004010708A4201moval,byteptr [edx +1]
004010738845FCmovbyteptr [ebp-4],其他
第一种在读取时将字符串中的元素直接读取到寄存器cl中,第二种需要先将指针值读取到edx中. 根据edx读取字符显然很慢.
2.7摘要:
堆和堆栈之间的区别可以通过以下类比看出:
使用堆栈就像我们去餐厅吃饭一样,只需点菜(发出申请),付款并吃东西(使用),吃饱后就离开,不需要注意食物的准备工作洗菜,洗碗等. 刷碗等扫地工作,他的优点是速度快,但自由度小.
使用堆就像制作自己喜欢的菜肴. 这比较麻烦,但是更符合您自己的口味并且拥有更多的自由.
堆,堆
堆空间
个
内存分配属于用户级内存分配. 分配的内存需要手动释放,否则会导致内存泄漏. 当然,当应用程序被破坏时,它也可以被释放. 在32位系统中,堆大小可以达到

4G,可以看出堆空间可能非常大. 但是,频繁分配和释放堆可能会导致内存碎片,还可能导致频繁出现内核模式和用户模式(Unix / Linux内核模式和用户模式)
传统的切换和申请内存会降低性能. 例如,为了分配一块内存,C / C ++库函数将遵循某种算法
打开
搜索堆内存以查看是否有足够的可用空间. 如果没有足够的空间(可能是由于内存碎片过多),则可以通过执行系统调用来增加程序数据段的空内存.
这样,您就有机会分配足够的内存,然后返回. 但是,我们必须看到堆为我们提供了足够的内存使用灵活性. 特别是在某些时候,动态分配内存可以为我们提供帮助
大大节省了内存空间.
堆栈空间
个
内存分配由系统管理. 它是系统级的内存分配,通常不需要我们手动控制. 局部变量,被调用子例程的返回地址以及寄存器信息存储在堆栈中. 我们
知道堆栈是FIFO(先进先出)结构,因此堆栈空间上的内存始终被连续占用,并且不会发生内存碎片. 但是,堆栈的大小是有限的.
例如,在VC6中
下面,默认堆栈空间大小为
1M
. 当然可以修改:
打开项目并按如下所示操作菜单:
项目->设置->链接
,在
中

类别
已选择
输出
然后
保留
设置堆栈的最大值并
提交
.
堆和堆
堆和堆是两个不同的概念,但是我们经常用来说“堆”一词,这引起了许多误解. 因此,我们还需要了解堆与栈之间的关系和区别
.
首先,我们使用图片直观地解释堆和堆栈在内存中的位置关系.

3.13堆栈大小和堆大小
在Symbian OS中,程序的默认堆栈大小默认为8KB. 但是可以通过在项目的MMP文件中使用关键字EPOCSTACKSIZE来调整大小. 例如:
- EPOCSTACKSIZE 0x5000
以上语句将可执行文件的堆栈大小更改为20KB(十六进制为0x5000字节,十进制为20480字节). 堆栈大小最大为80KB.
默认的最小堆大小为4KB,最大堆大小为1MB. 两者都可以调整,宏EPOCHEAPSIZE也用于调整项目的MMP文件. 例如:
- EPOCHEAPSIZE 0x5000 0x10000
上面的语句将默认的最小堆大小更改为20KB(0x5000字节),将最大堆大小更改为1MB(0x10000字节). 这是什么意思?
如果可用内存小于20KB,则无法启动该过程.
该进程占用的堆内存不超过1MB.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-225724-1.html
我宁可去买秋林的格瓦斯喝也不会买这种东西
日本已經主張台灣主權