windows堆问题
windows核心编程中说的缺省堆到底被操作系统用来干嘛?
默认开辟1mb的大小,多线程无法访问,它有何作用?
还有,一个堆空间的开辟是在程序执行开始时被开辟。。
而对于c++来说,堆空间开辟是new,new必定会调用函数,函数就有栈。
系统是先开辟堆空间,再执行new函数然后向堆空间写入数据的吗?还是其他的顺序?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先看图
从下往上数4,5分别为stack,heap,空间不够大的时候,是可以扩展的。扩展的方向相反。一个向上生长,一个向下。(就像是背靠背的兄弟)。
就是说,一旦pe被加载,基本布局已定。
这样再来回答你的问题:
-- 缺省堆到底被操作系统用来干嘛?
1. 一个进程可以有多个堆,但是至少要有一个堆,用于new分配内存。反正都要有,os就帮程序员创建,不劳程序员的驾。这样的做法对进程和线程也是。你创建进程的主线程是os帮到做了,程序员不需要管。
--堆空间开辟是new,new必定会调用函数,函数就有栈。
2. new不是开辟堆空间。而是从默认的堆上分配内存给指针。new只能在堆指定的地址空间内分配其中一部分的内存出来。就是说,再怎么new,也不可能出现地址在stack上的,也不可能占用 code and static data ,kernal space 等等的地址的。要按规矩来。
--系统是先开辟堆空间,再执行new函数然后向堆空间写入数据的吗?
3.回头看图。加载pe就已经有了堆空间和栈空间了。和你的new执行多少次无关。但是函数的执行比较深的话,stack会扩大,new的内存多的话,heap会扩大