C++内存分区与汇编的内存分段是什么联系?

qianwen36 2011-11-25 10:17:14
常听说C++内存模型中提到有三个分区,静态存储区,堆还有栈区;
我忽地又想起汇编中所提及的,三个分段,代码段,数据段,堆栈段;

突然这些概念给我带来的混乱。

刚看了一个帖提出什么基栈、浮动栈和堆三个分区。链接:http://www.cnblogs.com/iuices/archive/2011/11/24/2262324.html
他所指出基栈就是所谓静态区,浮动栈就所谓线程栈,堆即内存malloc/new的地方。而且指出其在进程私有空间中的次序。
从0到0x7f ffff分别出现,基栈、浮动栈和堆分配,堆分配是从上而下分配的。


我在VS2003环境下具体观察变量太函数入口地址。完全不符
我看到的是,从高址往下,先是静态存储{全局变量,静态变量,字符串常量},程序代码区,堆分配(分配自低往上),栈空间

所以我很奇怪了,我看到的这些地址信息,是否不足以确定内存分区管理。因为根据汇编知识,内存地址计算是通过段地址与偏移地址来计算的。而我们看到的地址可能就只是偏移址。那我们到底如何确定C++编译是如何进行内存分区的。
...全文
251 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightkids_008 2011-11-25
  • 打赏
  • 举报
回复
楼上说的对,32位已经不再使用地址加法器来算地址了,而是使用线性地址,通过内存页的管理机制可以找到对应的物理内存。如果CR0的PG是0,那么你得到的就是实际的地址,如果是1则是线性地址。一般来说你看到的都是启用了分页后的地址。
贪食蛇男 2011-11-25
  • 打赏
  • 举报
回复
概念完全不一样,C/C++内存模型是指程序运行时的内存地址空间布局,静态存储区是指程序编写时使用的静态变量或一些全局变量映射进内存后的内存页。堆是指动态分配时由操作系统分配的页。栈则是每个线程初始化时由操作系统指定的一个地址,线程创建时才有栈的概念。

你说的汇编是指16位汇编了,32位汇编后使用线性地址,即所谓平坦内存模型。虽然有段描述符选择子这种东西,但不再用段地址+偏移这种麻烦的方式。
16汇编中的三个分段概念是比较死的:代码段就是指 cs 寄存器标志的段,即使你手动改 cs 的值,强制使它指向存取数据的区域,它取指令就从存取数据的区域来取了。同样的,数据段是指 ds 寄存器指向的段,栈段是指 ss 寄存器指向的段。

C/C++内存模型中的说法和16位汇编中段的划分基本上没啥联系。但是在一般情况下(有各种非法手段打破一般情况……) 汇编中认为的数据段对应着C/C++内存模型中的堆区和静态存储区,汇编中认为的代码段则是可执行文件中的代码节在进程地址空间中映射的页,汇编中认为的栈段则和C/C++内存模型中的栈基本一致。
qianwen36 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nightkids_008 的回复:]
楼上说的对,32位已经不再使用地址加法器来算地址了,而是使用线性地址,通过内存页的管理机制可以找到对应的物理内存。如果CR0的PG是0,那么你得到的就是实际的地址,如果是1则是线性地址。一般来说你看到的都是启用了分页后的地址。
[/Quote]
谢谢,那回答我第二个问题。C++编译器对内存的分区。

为什么我看到VS下打印出来的地址是

静态变量地址 > 全局变量地址 > 字符串常量地址 > 函数入口地址 > 堆地址 > 局部变量地址
而且堆分配的地址,也不是说自高往低分配给申请操作的,而是由底往上的

那么那个人的博客是错的?
qq120848369 2011-11-25
  • 打赏
  • 举报
回复
没学过汇编....

65,203

社区成员

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

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