栈的空间能申请多大?

KWDIWT 2012-11-23 01:47:31
我查了一下说是跟OS和开发环境有关系..
OS是不是规定了栈的大小? 栈那么好,为什么不做大一点呢?
...全文
1594 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫步者、 2012-11-24
  • 打赏
  • 举报
回复
好像是1MB,我当时也试过,记得不是很轻了
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
栈太大浪费内存空间。 mk:@MSITStore:C:\MSDN98\98VS\2052\techart.chm::/html/msdn_heapmm.htm Managing Heap Memory in Win32
mk:@MSITStore:C:\MSDN98\98VS\2052\techart.chm::/html/msdn_heapmm.htm 大哥你这句麻意思小的看不懂 叫我去查MSDN??
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
引用 17 楼 baichi4141 的回复:
引用 11 楼 KWDIWT 的回复:我就不明白了,为什么要区分栈 堆...直接全部搞成栈不行了么... 难道跟硬件有关.. 我觉得我说的很明白了,你是看不懂还是根本就不看? 栈的缺点在于“初始申请全部内存,所有数据先进后出”,例如你按照使用逻辑定义下列对象:一个整数,一块内存,一个整数,一块内存,那么在第二个整数退出使用之前,第一块内存就必须留在栈里面,无关你用不用……
好吧 我承认我上面没仔细看...
赵4老师 2012-11-23
  • 打赏
  • 举报
回复
栈太大浪费内存空间。 mk:@MSITStore:C:\MSDN98\98VS\2052\techart.chm::/html/msdn_heapmm.htm Managing Heap Memory in Win32
baichi4141 2012-11-23
  • 打赏
  • 举报
回复
引用 11 楼 KWDIWT 的回复:
我就不明白了,为什么要区分栈 堆...直接全部搞成栈不行了么... 难道跟硬件有关..
我觉得我说的很明白了,你是看不懂还是根本就不看? 栈的缺点在于“初始申请全部内存,所有数据先进后出”,例如你按照使用逻辑定义下列对象:一个整数,一块内存,一个整数,一块内存,那么在第二个整数退出使用之前,第一块内存就必须留在栈里面,无关你用不用它。结果就是,第一块内存就算浪费了。 堆的优点,就在于各块内存之间的无关性。栈的缺点,就在于各块内存是相关的。内存都是一样的,两种使用方法决定了它们各自的特点和性能。要按你想的“全部搞成栈”,那内存的使用效率将大大降低,因为绝大多数时间内,只有栈顶附近的那点数据被使用,而时间效率也会大大降低,因为要管理全部内存,内存之间的数据操作也要跨越太长地址,等等等等。 最简单的例子,所有内存长度不定的数据类型,它们扩展长度的方法都是“申请更大的空间,把现有数据复制过去,删除现有空间”。如果只有栈内存没有堆内存,那么每次扩展长度,都会直接导致原来的空间被浪费。 这还只是一个简单的例子,在任何复杂的系统里,都难以保证“每个变量必定在另一个特定的变量之前被删除,这些关系构成一个固定的序列”。不能保证这一点,这些变量所占用的内存空间就全部不能释放,后果——任何一个大一些复杂一些的系统,都会导致内存被迅速耗尽,最终系统崩溃。 好吧,说再多大概你也没兴趣听。 那只有一句回答,爱学不学,只想学1+1=2可以回去念小学。
mujiok2003 2012-11-23
  • 打赏
  • 举报
回复
引用 15 楼 KWDIWT 的回复:
引用 12 楼 breakfisher 的回复:跟OS和开发环境有关系的,楼主可以自己测试一下,代码: C/C++ code?123456789101112131415#include <stdio.h> long int count = 0;void func(int a, int b) { char msg[1024]; printf("count: %ld\……
1.问什么要区分? 堆上的内容生存期由程序员决定,而栈上的内容的生存期由系统决定。如果我们需要自己控制对象的生存期,则需要堆。 2 问什么要限制/不限制 操作系统管理内存需要,主要考虑性能。栈空间连续,有更好的局部性,更容易利用CPU的cache。
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
引用 12 楼 breakfisher 的回复:
跟OS和开发环境有关系的,楼主可以自己测试一下,代码: C/C++ code?123456789101112131415#include <stdio.h> long int count = 0;void func(int a, int b) { char msg[1024]; printf("count: %ld\n", count++); func(coun……
这我知道 我问的问题是为什么要限制栈的大小?为什么要区分堆栈?
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
引用 13 楼 mujiok2003 的回复:
跟os有关。 比如windows, 在链接时确定栈的大小(可以由连接器的选项指定,如果未指定则用默认值1MB).有些Unix好像可以则链接时指定初始大小,运行时可以根据需要动态增长(当然受限于进程的地址空间大小)
为什么要限制栈的大小?而堆不限制.... 为什么要区分堆栈?而不直接搞成栈?
mujiok2003 2012-11-23
  • 打赏
  • 举报
回复
跟os有关。 比如windows, 在链接时确定栈的大小(可以由连接器的选项指定,如果未指定则用默认值1MB).有些Unix好像可以则链接时指定初始大小,运行时可以根据需要动态增长(当然受限于进程的地址空间大小)
breakfisher 2012-11-23
  • 打赏
  • 举报
回复
跟OS和开发环境有关系的,楼主可以自己测试一下,代码:
#include <stdio.h> 

long int count = 0;
void func(int a, int b) {
  char msg[1024];
  printf("count: %ld\n", count++);
  func(count, count);
}

int main(void) 
{
  int a = 0, b = 0;
  func(a, b);
  return 0;
}
当Segmentation fault之前的count值就差不多是栈的大小,单位为K
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
我就不明白了,为什么要区分栈 堆...直接全部搞成栈不行了么... 难道跟硬件有关..
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
引用 4 楼 baichi4141 的回复:
栈内存的效率的确是最高的,因为栈并不是一次次的分配内存,而是初始分配整个内存,每次压栈的时候只是单纯的移动栈指针而已 但栈的优点和缺点是一体的,都源于它的概念“先进后出”。简单地说,你先压栈一万字节,再压栈五个字节,在这五个字节被弹出栈之前,那一万个字节必须一直放在栈内——哪怕这五个字节你要使用一年,而那一万个字节你只使用一毫秒 堆内存的效率略低,主要是因为堆是随……
太大的栈内存可能会导致空间效率和时间效率的大大降低//栈太大为什么会效率降低?什么原理?
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
引用 5 楼 sjjwan 的回复:
在windows程序中,每个线程都有自己的栈,我们定义的局部变量,参数都是编译系统在栈中分配,程序员无法干涉,只有堆,程序员可以自由的动态分配与释放。
求相关资料
AlliumCepa 2012-11-23
  • 打赏
  • 举报
回复
栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的。
bsnry 2012-11-23
  • 打赏
  • 举报
回复
引用 5 楼 sjjwan 的回复:
在windows程序中,每个线程都有自己的栈,我们定义的局部变量,参数都是编译系统在栈中分配,程序员无法干涉,只有堆,程序员可以自由的动态分配与释放。
++
wingzero520 2012-11-23
  • 打赏
  • 举报
回复
有编译选项可以调整,比如 VS 系列在链接时用 /F 参数
sjjwan 2012-11-23
  • 打赏
  • 举报
回复
在windows程序中,每个线程都有自己的栈,我们定义的局部变量,参数都是编译系统在栈中分配,程序员无法干涉,只有堆,程序员可以自由的动态分配与释放。
baichi4141 2012-11-23
  • 打赏
  • 举报
回复
栈内存的效率的确是最高的,因为栈并不是一次次的分配内存,而是初始分配整个内存,每次压栈的时候只是单纯的移动栈指针而已 但栈的优点和缺点是一体的,都源于它的概念“先进后出”。简单地说,你先压栈一万字节,再压栈五个字节,在这五个字节被弹出栈之前,那一万个字节必须一直放在栈内——哪怕这五个字节你要使用一年,而那一万个字节你只使用一毫秒 堆内存的效率略低,主要是因为堆是随机访问,这里的随机,意为“每一块内存都和另一块内存没有先后关系”。申请堆内存的效率可能不比栈内存低多少,但释放堆内存的时候,释放的内存可能需要和旁边的未使用内存重新连成一个整体,以供下一次分配,因此释放堆内存的效率可能会较低,这是为了下一次申请时更快而必须付出的代价。 操作系统对栈的限制这我不了解,我只知道在编译器设置里可以限定栈的最大大小,例如VS里默认是1M大小 如果你需要更大的空间,可以自己在堆中申请,自己实现一个栈,而不是使用默认的栈内存,默认的栈内存主要用于流程控制,例如函数传参和临时变量保存等等,不需要太大。太大的栈内存可能会导致空间效率和时间效率的大大降低,如果你需要使用太大的栈内存,一般认为是你程序设计有问题
derekrose 2012-11-23
  • 打赏
  • 举报
回复
对于 x86 和 x64 计算机,默认堆栈大小为 1 MB。在 Itanium 芯片组上,默认大小为 4 MB。
KWDIWT 2012-11-23
  • 打赏
  • 举报
回复
引用 1 楼 nbaallstar901025 的回复:
栈???你说的是堆吧
你没看错就是栈...
加载更多回复(1)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧