如何理解把内存分为4段,栈区,堆区,代码区,全局变量区?

内存可分为4段,或者有人说是5段云云。可是,内存为什么要这样分配呢?这里的内存应该指的是虚拟内存吧,这样分配之后,再通过段页式存储机制映射到实际的物理内存,岂不挺麻烦的?... 内存可分为4段,或者有人说是5段云云。
可是,内存为什么要这样分配呢?
这里的内存应该指的是虚拟内存吧,这样分配之后,再通过段页式存储机制映射到实际的物理内存,岂不挺麻烦的? 比如:char *p3 = "123456"; // 123456\0在常量区,p3在栈上。 这样把程序分解的支离破碎的到底是否能真的提高效率?

还有,代码区是个什么啊,不是把代码都解体了吗,该去栈的到栈里去个,该去静态区的区静态区。
展开
 我来答
4443248866c59
推荐于2016-09-14 · 知道合伙人数码行家
4443248866c59
知道合伙人数码行家
采纳数:4064 获赞数:87692
本人热心公益,喜欢帮助他人解决问题。

向TA提问 私信TA
展开全部
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源;

2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收;

3、全局变量区(datasegment)—存放全局变量,静态变量和字符串常量,不释放;

4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。
东莞市友贸实业有限公司_
2023-11-22 广告
第五代双倍数据速率DDR5双列直插式内存模块是一种高速、高性能的内存模块,适用于需要高带宽和低延迟的应用场景。与前几代内存模块相比,DDR5双列直插式内存模块具有更高的数据传输速率和更低的功耗,同时提供了更大的内存容量和更高的可靠性。在数据... 点击进入详情页
本回答由东莞市友贸实业有限公司_提供
reverse_walker
推荐于2018-02-10 · TA获得超过590个赞
知道小有建树答主
回答量:377
采纳率:0%
帮助的人:462万
展开全部
应该是DLL, EXE等文件 分为代码区和数据区
代码区的是只读的, 防止代码恶意写入
数据区再分为只读, 读写, 只写

然后EXE载入内存的时候, 分为静态区, 栈区, 和堆区
文件数据区的数据肯定, 放在静态区
代码执行时产生的临时数据, 放在栈区
代码执行时产生的持续性数据, 放在堆区

虚拟内存是把硬盘的空间, 挪为内存使用. 系统这么做是有目的的, 包括
扩展内存, office自动存储文件, 休眠等等

虚拟内存只是个服务, 你说的分解代码和它的用途无关,
分段式和分页式是实现虚拟内存技术的时候才有意义.

最后代码区放在程序无权访问的0x7FFFFFFF以上的异次元内存空间.
追问
我说的虚拟内存指的是虚拟地址空间,比如linux就有4G的虚拟内存。

还是上面那个问题:char *p3 = "123456"; // 123456\0在常量区,p3在栈上。

程序是在编写的时候,就把相应的值写到对应的内存区吗,还是编译的时候才分配的?或者说是运行的时候才写到对应区的?

【虚拟内存和虚拟地址空间 两个概念不指名,就容易混淆了】
追答
常量区的数据在链接的的时候就放入*.exe的数据区, 所有数据区的东西在读入内存时候, 都放入常量区

虚拟内存和虚拟地址空间是完全不同的概念.
32位的CPU都只有4G的寻址空间.虚拟不虚拟无关系.
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式