程序内存分布(比较全面,欢迎讨论)

Zilog_T 2007-11-19 10:56:51
在程序执行中,会给程序分配一定的内存空间,分别用来作为代码段,堆,栈使用。堆向上增长,栈向下增长。
地址空间应该是从0x00000000开始,因为所使用的是虚拟地址。
问题:这个内存空间应该是多大,根据什么得来?在程序中如何得到开始地址和结束地址?
   如何得到代码段,堆,栈的开始地址?(程序中声明一个变量,然后取地址?)

一个类在内存中所占的空间不用考虑成员函数(虚函数要维护一个函数表指针),只考虑成员变量(有内存对齐问题)。
成员函数在内存中是怎样存储的,存在代码段中?成员变量存在哪里?

在程序段中呢?
在程序段中,变量在栈上分配,动态分配的成员在堆上分配空间,函数呢?存在哪里?

----------------------------------
对这个问题思考很久了,其中一部分能明白,也还有很多不明白,请达人指点。也欢迎大家讨论。
目前我所知道的一些方法为:取变量地址操作,函数指针地址,SizeOf操作。试验之后还是有很多疑问没解决。
...全文
391 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zilog_T 2007-11-25
  • 打赏
  • 举报
回复
谢谢z_kris
flyingscv 2007-11-20
  • 打赏
  • 举报
回复
代码存在代码区,只有一份,不管是函数、还是内联或者类的成员函数
数据存在数据区,有多少份存多少份
z_kris 2007-11-20
  • 打赏
  • 举报
回复
当你保留地址空间的一个区域时,系统还要确保该区域的大小是系统的页面大小的倍数。页面是系统在管理内存时使用的一个内存单位。与分配粒度一样,不同的C P U,其页面大小也是不同的。x 8 6使用的页面大小是4 KB,而A l p h a(当既能运行3 2位Windows 2000也能运行6 4位Windows 2000时)使用的页面大小则是8 KB。在撰写本书时, M i c r o s o f t预计I A - 6 4也使用8K B的页面。但是,如果测试显示使用更大的页面能够提高系统的总体性能,那么M i c r o s o f t可以切换到更大的页面(1 6 K B或更大)。

本来想用自己的语言描述,后面一想又怕言不达意引起误会,干脆引用原文
z_kris 2007-11-20
  • 打赏
  • 举报
回复
每当你保留地址空间的一个区域时,系统要确保该区域从一个分配粒度的边界开始。对于不同的C P U平台来说,分配粒度是各不相同的。但是,截止到撰写本书时,所有的C P U平台(x 8 6、3 2位A l p h a、6 4位A l p h a和I A - 6 4)都使用6 4 K B这个相同的分配粒度。

PS:本书指的是《WINDOWS核心编程》

z_kris 2007-11-20
  • 打赏
  • 举报
回复
我是菜鸟 胡说几句,不知道对不对
前面那个问题和操作系统以及分区的内容有关
WINDOWS核心编程上有讲解的
见《WINDOWS核心编程》表13-1 进程的地址空间如何分区

关于类的内存问题,根据我自己的理解是也与具体编译器有关,一般来说C++里的类在刚定义时并不占用内存,实例化对象后,每个对象维持一份自己的拷贝,这里面就包含了成员变量。普通成员函数在编译期间静态展开,被调用时在内存中生成一份拷贝供使用。内联函数在被调用期间才在调用点展开,不用拷贝,所以效率更高点。

程序段中的函数和上面的有点像吧,也是在被调用时生成一份拷贝,拷贝在进程的栈中。

说的不对请大家尽情拍砖,这样我记得更清楚:)
leigao_IT 2007-11-20
  • 打赏
  • 举报
回复
debug应该可以看到吧.

64,282

社区成员

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

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