none
C++中存储区 和 操作系统中分配的存储区之间关系? RRS feed

  • 问题

  • C++中提到的存储区:静态区,栈区,堆区,这些概念,是用到编译阶段还是执行阶段?

    我的想法是这样的,不知道对不?
    静态区,栈区,堆区,这些概念只在编译阶段有意义,编译进程从相应的区取各种变量、数据,编译、连接完成后,生成可执行代码;在程序(.exe)执行时,内存的分配是由操作系统完成的,用某种装入方法装入内存,此时程序占的内存区就不能叫“静态区,栈区,堆区”了,此时内存分为用户区和系统区(OS里这样划分的),程序应该放到用户区。
    我的说法不知对不对,请高手指点,先谢谢了!
    2009年4月14日 11:18

答案

  • C++的存储区分为常量存储区、全局(静态存储区)、堆、栈,有的资料还包括自由存储区。
    每个进程执行的时候都有自己的地址空间。地址空间中包括代码段,数据段,堆栈段。操作系统在执行一个进程的时候会把进程的地址空间映射到内存中。由于物理内存没有进程需要的地址空间大,并且在现代并发操作系统中将会有多个进程公用有限的物理内存。所以出现了虚拟内存。那么进程的地址空间其实是被映射到虚拟内存中的。当进程执行的过程中需要那部分的地址,就会将虚拟内存中的相应部分以页的形式提交到物理内存中。
    所以这里说的C++的存储区和进程的地址空间有映射关系。并且会放到地址空间的用户区。

    这里涉及的概念比较多,有问题可以继续讨论。
    • 已标记为答案 KeFang Chen 2009年4月20日 10:00
    2009年4月15日 1:03
    版主

全部回复

  • C++的存储区分为常量存储区、全局(静态存储区)、堆、栈,有的资料还包括自由存储区。
    每个进程执行的时候都有自己的地址空间。地址空间中包括代码段,数据段,堆栈段。操作系统在执行一个进程的时候会把进程的地址空间映射到内存中。由于物理内存没有进程需要的地址空间大,并且在现代并发操作系统中将会有多个进程公用有限的物理内存。所以出现了虚拟内存。那么进程的地址空间其实是被映射到虚拟内存中的。当进程执行的过程中需要那部分的地址,就会将虚拟内存中的相应部分以页的形式提交到物理内存中。
    所以这里说的C++的存储区和进程的地址空间有映射关系。并且会放到地址空间的用户区。

    这里涉及的概念比较多,有问题可以继续讨论。
    • 已标记为答案 KeFang Chen 2009年4月20日 10:00
    2009年4月15日 1:03
    版主
  • 感谢SplendourG!
    我也希望继续讨论,我们可以交流更多

    2009年4月15日 7:13