计算机语言里的堆栈是什么意思(计算机语言里的堆栈是什么)

本文主要内容来源于网络!“栈是栈,栈是栈,栈不是栈,栈不是栈,栈是栈,你真好,混蛋,如下,别再犯难了”这是介绍堆栈的方式。如果你不懂,那就没办法了!一,程序的初

计算机语言里的堆栈是什么意思(计算机语言里的堆栈是什么)

本文主要内容来源于网络!

“栈是栈,栈是栈,栈不是栈,栈不是栈,栈是栈,你真好,混蛋,如下,别再犯难了”

这是介绍堆栈的方式。如果你不懂,那就没办法了!

一,程序的初步知识记忆分配

由C/C++编译的程序所占用的内存分为以下几部分

1.stack)——由编译器自动分配和释放,它存储函数的参数值、局部变量的值等。它像数据结构中的堆栈一样工作。

2.heap)——一般由程序员分配和释放。如果程序员不释放它,它可能会在程序结束时被OS恢复。注意在数据结构上和堆不同,但是分配方式和链表差不多,呵呵。

3.全局区(静态区)——全局变量和静态变量存储在一起,初始化的全局变量和静态变量在一个区域,未初始化的全局变量和未初始化的静态变量在另一个相邻区域。-程序结束后会有系统发布。

4.文本常量区域-常量字符串位于此处。程序完成后,由系统释放。

5.程序代码区——存储函数体的二进制代码。

第二,示例程序

这是一位前辈写的,写的很详细。

//main.cpp

int a = 0;//全局初始化区域

char * p1//全局未初始化区域

主()

{

int b;//堆栈

char s[]= " ABC ";//堆栈

char * p2//堆栈

char * p3 = " 123456//" 123456[22] "在常量区,p3在堆栈上。

静态int c = 0;//全局(静态)初始化区域

P1 =(char *)malloc(10);

p2 =(char *)malloc(20);

//10和20字节的分配区在堆区。请注意,P1和P2是局部变量。

strcpy(p1," 123456 ");//“123456 0”放在常量区,编译器可能会优化到与p3指向的“123456”相同的位置。

}

三、堆和栈的理论知识

3.1应用方法

堆栈:

由系统自动分配。比如在函数中声明一个局部变量int b;系统自动在栈中为B打开空空间。

堆:

需要程序员自己申请,并在c中注明malloc函数的大小。

P1 = (char *)马洛克(10);

在C++中使用新运算符

P2 = (char *)马洛克(10);

但是请注意,p1和p2本身就在堆栈中。

3.2

应用后系统的响应

Stack:只要堆栈剩余的空大于请求的空,系统就会为程序提供内存,否则会报告异常指出堆栈溢出。

Heap:首先你要知道操作系统有一个空空闲内存地址的链表。当系统接收到程序的应用时,

它会遍历链表,找到第一个空大于请求的空的堆节点,然后从空空闲节点链表中删除该节点,并将该节点的空赋给程序。另外,对于大部分系统来说,都会存放在这个内存/[/k0]中另外,因为找到的堆节点大小不一定正好等于应用的大小,所以系统会自动把多余的部分放回空 idle列表中。

3.3应用规模的限制

堆栈:在Windows下,堆栈是一种扩展到低位地址的数据结构,是连续内存的一个区域。这句话的意思是栈顶的地址和栈的最大容量是由系统预先确定的。在WINDOWS下,栈的大小是2M(有人说1M,简而言之,是编译时确定的常数)。如果请求的空空间超过堆栈的剩余空空间,将提示溢出。因此,堆栈中可用的空很小。

Heap: Heap是扩展到高位地址的数据结构,是一个不连续的内存区域。这是因为系统使用链表存储空空闲内存地址,自然是不连续的,链表的遍历方向是从低位地址到高位地址。堆的大小受到计算机系统中可用虚拟内存的限制。可见堆得到的空是灵活的,大的。

3.4应用效率比较:

堆栈由系统自动分配,速度更快。但是程序员控制不了。

Heap是new分配的内存,一般比较慢,容易出现内存碎片,但是用起来最方便。

另外,在WINDOWS下,最好的方法是使用VirtualAlloc来分配内存。它不在堆里,也不在栈里,而是直接在进程的地址空里保留了一个快速内存,虽然用起来最不方便。但它是快速且最灵活的。

3.5堆和堆栈中的存储内容

堆栈:调用函数时,主函数中下一个指令(函数调用语句的下一个可执行语句)的地址是堆栈上的第一个,后面是函数的参数。在大多数C编译器中,参数从右到左堆叠,然后是函数中的局部变量。请注意,静态变量是不堆叠的。

当这个函数调用完成后,先将局部变量弹出堆栈,然后是参数,最后堆栈顶部的指针指向第一个存储的地址,也就是主函数中的下一条指令,程序从这里继续运行。

堆:通常,在堆的头部使用一个字节来存储堆的大小。堆的具体内容由程序员安排。

3.6访问效率比较

char S1[]= " aaaaaaaaaaaaaaaa ";

char * s2 = " bbbbbbbbbbbbbbbbb

aaaaaaaaaa是在运行时分配的;

Bbbbbbbbbbb是在编译时确定的;

但是在以后的访问中,栈上的数组比指针指向的字符串(比如heap)要快。

例如:

#包括

void main()

{

char a = 1;

char c[]= " 1234567890 ";

char * p = " 1234567890

a = c[1];

a = p[1];

返回;

}

相应的装配代码

10:a = c[1];

00401067 8A 4D F1 mov cl,字节指针[ebp-0Fh]

0040106A 88 4D FC mov字节ptr [ebp-4],cl

11:a = p[1];

0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]

00401070 8A 42 01 mov al,字节ptr [edx+1]

00401073 88 45 FC mov字节ptr [ebp-4],al

第一种是直接将字符串中的元素读入寄存器cl,第二种是先将指针值读入edx,根据edx读取字符时明显较慢。

四。摘要

堆和栈的区别可以通过下面的比喻看出:

使用栈就像去餐厅吃饭,只需要点餐(申请)、付款、吃饭(使用)。吃饱了就走,不理会切菜洗菜等准备工作和洗碗洗锅等收尾工作。它的优点是速度快,但自由度小。

就像自己做自己喜欢的菜一样。比较麻烦,但是比较符合自己的口味,自由度很大。

堆和栈的主要区别是:

操作系统中的堆和栈,比如上面提到的那些,就不说了。

数据结构中也有堆和栈。这些是不同的概念。这里的堆实际上是指优先级队列的一种数据结构(满足堆的性质),第一个元素的优先级最高;栈实际上是一种数学或数据结构,满足FIFO的性质。

stack和stack虽然叫在一起,但还是有很大的区别,因为历史原因。

1.内存分配:

堆:一般由程序员分配和释放。如果程序员不释放它,操作系统可能会在程序结束时回收它。注意在数据结构上和堆不同,分配方式和链表类似。可能的关键字如下:new、malloc、delete、free等。

堆栈:由编译器自动分配和释放,存储函数的参数值、局部变量的值等。它像数据结构中的堆栈一样工作。

2.应用方法:

Heap:需要程序员自己申请,并注明大小。c中的malloc函数是P1 =(char *)malloc(10);在C++中使用new运算符,但注意p1和p2本身在堆栈中。因为它们仍然可以被认为是局部变量。

堆栈:由系统自动分配。比如声明一个局部变量int b;在函数中;系统自动为栈中的B打开一个空房间。

3.系统响应:

Heap:操作系统有一个链表,记录空空闲内存的地址。当系统收到程序的申请时,会遍历链表,找到空之间大于申请的空的第一个堆节点,然后从空空闲节点链表中删除该节点,并添加其/。此外,由于找到的堆节点的大小不一定完全等于应用程序的大小,系统会自动将多余的部分放回空 idle列表中。

Stack:只要堆栈剩余的空大于请求的空,系统就会为程序提供内存,否则会报告异常指出堆栈溢出。

4.尺寸限制:

堆:是一种扩展到高位地址的数据结构,是一个不连续的内存区域。这是因为系统使用链表存储空空闲内存地址,自然是不连续的,链表的遍历方向是从低位地址到高位地址。堆的大小受到计算机系统中可用虚拟内存的限制。可见堆得到的空是灵活的,大的。

堆栈:在Windows下,堆栈是一种扩展到低位地址的数据结构,是连续内存的一个区域。这句话的意思是栈顶的地址和栈的最大容量是由系统预先确定的。在WINDOWS下,堆栈的大小是固定的(一个在编译时确定的常数)。如果请求的空空间超过堆栈的剩余空空间,将提示溢出。因此,堆栈中可用的空很小。

5.效率:

heap:new分配的内存,一般比较慢,容易出现内存碎片。但是,用起来最方便。另外,在WINDOWS下,最好的办法是用VirtualAlloc分配内存,不在堆里,也不在栈里,直接在进程的地址空里保留一个快速内存,虽然用起来最不方便。但它速度快,最灵活。

栈:由系统自动分配,速度快。但是程序员控制不了。

6.存储内容:

堆:通常,在堆的头部使用一个字节来存储堆的大小。堆的具体内容由程序员安排。

堆栈:调用函数时,主函数中下一个指令(函数调用语句的下一个可执行语句)的地址是堆栈上的第一个,后面是函数的参数。在大多数C编译器中,参数从右到左堆叠,然后是函数中的局部变量。注意:静态变量是不堆叠的。当这个函数调用完成后,先将局部变量弹出堆栈,然后是参数,最后堆栈顶部的指针指向第一个存储的地址,也就是主函数中的下一条指令,程序从这里继续运行。

7.访问效率:

heap:char * S1 = " hello word ";是在编译时确定的;

stack:char S1[]= " hello word ";是在运行时分配的;使用数组比使用指针更快,因为指针需要由底层程序集中的edx寄存器传输,而数组是直接在堆栈上读取的。

~~~end~~~

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/348512.html

发表回复

登录后才能评论