问几个详细点的堆栈问题

uzwind 2011-05-17 03:13:39
本人小白一个 看到程序内存管理这一块 有几个不明白的地方
1 在调用不同函数的时候 栈的空间是常量吗?
如果不是常量 怎么确认栈的大小?会不会是根据函数参数和里面变量定义的多少来确定栈大小,个人感觉栈大小应该由编译时确认的因素来决定;
如果是常量,那这个数不可能太大,如果太大,递归调用要哭了,但是如果很小,我int a[10000];会不会不行(vc试了下,这样是可以的,但我网上看资料说windows给栈的空间是几M,费解)
2 在malloc new的时候 得到的空间在程序逻辑层肯定是连续的 但是如果操作系统的空闲内存表中已经没有连续空间可分配给程序了 但是几块空间加起来是够的 这种情况会分配吗?
我感觉会分配(要不太不智能了),但是如果空间太分散了,连续存储的优点不就没了么
3 堆栈的感念 是只有c c++这种偏底层的语言有 还是程序比较通用的思想 像JAVA这样的语言也有(可能被封装了)?

有的问题可能显得很傻x 还是望解答 谢谢
...全文
145 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pearling 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 uzwind 的回复:]
引用 5 楼 pearling 的回复:
1.是常量,LS的兄弟都说了我就不重复了
2.堆中的内存不一定是连续的,但是之所以我们在new后看到是连续的是因为编译器内部有一种自动管理内存分配的功能,在堆中的内存其实是以链表连接在一起的若干内存块,由系统进行管理,对我们是透明的
3.堆栈的概念几乎是每一种程序设计语言都存在的概念,发明java的初衷是把程序员从在C中的一些复杂且容易出错的工作中(……
[/Quote]
堆空间是连续的一块内存,但是申请的内存不一定是连续的,是由操作系统根据最先匹配、最优匹配、还是最差匹配(这是操作系统课程的知识)等等内存分配方式进行分配,这对我们来说是透明的。
就想叫yoko 2011-05-17
  • 打赏
  • 举报
回复
1, 是常量, windows核心编程上有说, 貌似还有函数可以设置这个值
2, 不会分配, 所以我们才不要去平凡new delete, 造成内存碎片过多
uzwind 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pearling 的回复:]
1.是常量,LS的兄弟都说了我就不重复了
2.堆中的内存不一定是连续的,但是之所以我们在new后看到是连续的是因为编译器内部有一种自动管理内存分配的功能,在堆中的内存其实是以链表连接在一起的若干内存块,由系统进行管理,对我们是透明的
3.堆栈的概念几乎是每一种程序设计语言都存在的概念,发明java的初衷是把程序员从在C中的一些复杂且容易出错的工作中(比如对申请的内存的回收)解放出来,由系统进行……
[/Quote]
1,3没问题了 关于2
"但是之所以我们在new后看到是连续的是因为编译器内部有一种自动管理内存分配的功能,在堆中的内存其实是以链表连接在一起的若干内存块,由系统进行管理,对我们是透明的"

int *a;
a=(int *)malloc(1024*sizeof(int));
a指向的空间一定是连续的吗?我感觉不是 可是按上面的2 3兄弟的意思 就是
你的意思是不是这样:
int *a;
int *b;
a=(int *)malloc(1024*sizeof(int));
b=(int *)malloc(1024*sizeof(int));
a,b所共同构成的程序的堆空间不连续
我想问的是是a内部和b内部是连续的吗?
如果是,系统不是很容易会出现没有连续空间可分配的情况,所以要时常清理;
如果不是,系统还要记录a内部不同块的链接,然后还要对程序透明,不是很麻烦?
pearling 2011-05-17
  • 打赏
  • 举报
回复
1.是常量,LS的兄弟都说了我就不重复了
2.堆中的内存不一定是连续的,但是之所以我们在new后看到是连续的是因为编译器内部有一种自动管理内存分配的功能,在堆中的内存其实是以链表连接在一起的若干内存块,由系统进行管理,对我们是透明的
3.堆栈的概念几乎是每一种程序设计语言都存在的概念,发明java的初衷是把程序员从在C中的一些复杂且容易出错的工作中(比如对申请的内存的回收)解放出来,由系统进行内存的回收和管理,而无需程序员的参与。这样的好处是程序员变得轻松了许多,但是对于一些高级的操作,在C/C++中可以完成但在java中就无能为力了。
uzwind 2011-05-17
  • 打赏
  • 举报
回复
2,3楼 受教了
关于第二个问题,是不是操作系统会经常(也许经常用的不准确)的整理内存区域,以使空间尽量的连续?
ma100 2011-05-17
  • 打赏
  • 举报
回复
1. 是常量, 但可以由编译选项来指定大小, 比如vc默认1M
2. 分散的空间不会new 成功
3. java有, 但是自动管理的
fish_phenix 2011-05-17
  • 打赏
  • 举报
回复
1 大小是常量,大概1m吧,不同电脑和编译器版本可能有差别
int a [10000]可以 但是 int a[1000*1000]就不幸了

2 物理上应该也是连续的,如果没有连续空间,系统回整理出连续空间

3 不清楚了,任何语言应该都有吧
uzwind 2011-05-17
  • 打赏
  • 举报
回复
错字了 3 堆栈的概念

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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