当前位置:首页 » 存储配置 » 栈的存储空间有多大

栈的存储空间有多大

发布时间: 2022-05-22 13:53:14

‘壹’ 栈的存储空间:1—m,top=1,不就是在栈顶吗,插入一个,top=2,这样理解哪里不对

栈是先进后出的嘛,栈顶一开始是m+1,那么入站一个元素后,栈顶将变成m,相当于减1。如果你不好想象,我举个例子。如果你把一个杯子打上刻度,杯口是1,杯底是10,杯子的大小刚好能放进一个橘子,如果我们认为一开始杯底是栈顶,也就是10,那么放一个橘子之后,杯底就变成9了,因为你不能再把东西放到比9大的地方,同理,8、7、6,如果你往外拿一个橘子,也是先拿上面的,这就是先进后出,后进先出。

‘贰’ 什么是栈区

定义栈时会申请一段地址,这段地址就是栈的存储区,用来存储栈的数据的。

‘叁’ 堆栈大小是多少,可否设置

/STACK选项设置堆栈的大小(以字节为单位)。此选项仅在生成.exe文件时使用。reserve值指定虚拟内存中的总的堆栈分配。对于x86和x64计算机,默认堆栈大小为1MB。在Itanium芯片组上,默认大小为4MB。commit取决于操作系统所作的解释。在WindowsNT和Windows2000中,它指定一次分配的物理内存量。提交的虚拟内存导致空间被保留在页面文件中。更高的commit值在应用程序需要堆栈空间时可节省时间,但会增加内存需求并有可能延长启动时间。对于x86和x64计算机,默认提交值为4KB。在Itanium芯片组上,默认值为16KB。以十进制或C语言表示法指定reserve值和commit值。

‘肆’ 编译器给栈分配的空间是不是2M啊

默认是1m,不过可以设

‘伍’ 栈的空间能申请多大

栈内存的效率的确是最高的,因为栈并不是一次次的分配内存,而是初始分配整个内存,每次压栈的时候只是单纯的移动栈指针而已
但栈的优点和缺点是一体的,都源于它的概念“先进后出”。简单地说,你先压栈一万字节,再压栈五个字节,在这五个字节被弹出栈之前,那一万个字节必须一直放在栈内——哪怕这五个字节你要使用一年,而那一万个字节你只使用一毫秒

堆内存的效率略低,主要是因为堆是随机访问,这里的随机,意为“每一块内存都和另一块内存没有先后关系”。申请堆内存的效率可能不比栈内存低多少,但释放堆内存的时候,释放的内存可能需要和旁边的未使用内存重新连成一个整体,以供下一次分配,因此释放堆内存的效率可能会较低,这是为了下一次申请时更快而必须付出的代价。

操作系统对栈的限制这我不了解,我只知道在编译器设置里可以限定栈的最大大小,例如VS里默认是1M大小
如果你需要更大的空间,可以自己在堆中申请,自己实现一个栈,而不是使用默认的栈内存,默认的栈内存主要用于流程控制,例如函数传参和临时变量保存等等,不需要太大。太大的栈内存可能会导致空间效率和时间效率的大大降低,如果你需要使用太大的栈内存,一般认为是你程序设计有问题

‘陆’ 一般的计算机内存中堆栈区的容量有多大

你的问题比较笼统,堆和栈是两个不同的概念,在内存中堆的大小受限于
计算机系统
中有效的
虚拟内存
,而栈的最大容量是系统预先规定好的,其获得的空间要小于“堆”

‘柒’ 栈内存空间是什么意思

栈区内存,由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。访问顺序遵循先进后出原则。 栈stack:是程序启动时候由程序留出的工作内存区 比如程序的局部变量,函数调用等都是从栈中获取,这个内存在需要的时候分配,不需要就释放 堆heap:是计算机空余的物理内存和硬盘空余空间的和。但是它的获取不是自动的了,相比从栈中分配内存要慢些。 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 关于堆栈的更多信息如下: ============================= 堆:顺序随意 栈:先进后出 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp 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所指向的"123456"优化成一个地方。 } 二、堆和栈的理论知识 2.1申请方式 stack:由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 heap:需要程序员自己申请,并指明大小,在c中malloc函数如p1 = (char *)malloc(10);在C++中用new运算符如p2 = (char *)malloc(10);但是注意p1、p2本身是在栈中的 2.2申请后系统的响应 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 2.3申请大小的限制 栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 2.4申请效率的比较: 栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活 2.5堆和栈中的存储内容 栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 2.6存取效率的比较 char s1[] = "aaaaaaaaaaaaaaa"; char *s2 = "bbbbbbbbbbbbbbbbb"; aaaaaaaaaaa是在运行时刻赋值的;而bbbbbbbbbbb是在编译时就确定的;但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 比如: #include void main() { char a = 1; char c[] = "1234567890"; char *p ="1234567890"; a = c[1]; a = p[1]; return; } 对应的汇编代码 10: a = c[1]; 00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 0040106A 88 4D FC mov byte ptr [ebp-4],cl 11: a = p[1]; 0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 00401070 8A 42 01 mov al,byte ptr [edx+1] 00401073 88 45 FC mov byte ptr [ebp-4],al 第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。 2.7小结: 堆和栈的区别可以用如下的比喻来看出:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 堆和栈的区别主要分: 操作系统方面的堆和栈,如上面说的那些,不多说了。还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

‘捌’ java 每个函数的栈空间大小是

在Java程序运行时,各个栈空间大小如下:
(1) 寄存器。最快的保存区域,位于处理器内部,数量十分有限,它是根据需要由编译器分配。我们对此没有直接的控制权.
(2) 栈(stack)。驻留于常规RAM(随机访问存储器)区域,这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这失去了一定的灵活性,因此对象句柄是存放在栈中,但Java对象并不放到其中。
(3) 堆(heap)。保存了Java对象。和栈不同,它最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
(4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
(6) 非RAM存储。数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。

‘玖’ 有六个元素6,5,4,3,2,1 的顺序进栈,得到出栈序列为:2 3 4 1 5 6,则栈的存储空间至

要2先出栈,必须先进栈的65432都在栈内,因为栈是后进先出的,所以接着3、4都可出栈,1可以即进即出,接着5出栈,6出栈,就完全符合出栈序列。所以栈的存储空间至少为5.

‘拾’ 什么是堆栈堆栈指针的SP的作用是什么8051单片机堆栈容量不超过多少字节

在调用子程序时需要保存调用函数的CPU寄存器PC指针,PC指针是被CALL指令自动压入SP所指向的片内存储器,CPU寄存器要由用户用PUSH指令自行保存,
因此SP的作用就是一个指针,当进行中断调用,子函数调用时将现场数据压入SP所指向的存储器,SP自动增加1或2,当中断结束RETI,调用返回RET,POP时将SP数据弹出,SP自动减1或2
8051最大为128字节的片内存储器,0X20以上理论都可以做堆栈用96字节,8052为256字节224字节可用
但这样便没有其它空间可用于数据存储
现在的单片机的程序一般都能用C51来,不用关心堆栈大小与SP寄存器

热点内容
樱花服务器测试ip 发布:2024-09-20 20:10:39 浏览:279
炉石传说安卓怎么玩 发布:2024-09-20 20:09:59 浏览:312
ios开会员为什么比安卓贵 发布:2024-09-20 20:09:55 浏览:568
缓存服务器redis 发布:2024-09-20 20:09:01 浏览:75
优酷上传ts 发布:2024-09-20 19:55:58 浏览:273
minecraft怎么开服务器地址 发布:2024-09-20 19:52:14 浏览:651
android弹出布局 发布:2024-09-20 19:14:29 浏览:981
预算法包括 发布:2024-09-20 18:52:07 浏览:764
什么数字后面跟着密码 发布:2024-09-20 18:52:07 浏览:878
订座源码 发布:2024-09-20 18:52:06 浏览:383