什么是C++中的RAM,Harddrive,堆栈和堆?

Mai*_*iss 11 c++ memory heap stack

有人可以告诉我们这些实例在C++运行时的运行情况(Harddrive,RAM,Stack或Heap):

  • 本地/全局变量

  • 类,方法和函数

  • 指针

  • 对象

Stack/Heap是否都位于物理RAM中?

如果有人可以在答案中包含硬件类比,我将不胜感激.谢谢.

Luc*_*ore 14

这通常取决于操作系统,但通常是这样的:

一切都进入了RAM.二进制文件驻留在硬盘驱动器中,但是,当运行时,它与相关库一起完全加载到RAM中.

堆栈和堆是实现细节,但它们也驻留在RAM中.

尽管加载在RAM中,但内存不能直接寻址.操作系统为每个进程分配虚拟内存.这意味着该地址0x001实际上并不位于0x001RAM中,而是表示虚拟地址空间中的地址.

编辑:对其中一个评论的澄清:

二进制文件是否在运行时完全或部分加载?并且,这些二进制文件是仅在运行时访问过一次还是从Harddrive继续读取?

例如,在MS中,如果链接到库,它将在程序开始时在运行时完全加载.如果以编程方式加载它,通过LoadLibrary(),它会在函数调用时加载到内存中,并可以从内存中卸载.

  • 对.如果您(编写)编写需要任何类型性能的C++,那么虚拟内存实现细节非常重要.查看此维基百科页面即可开始使用:http://en.wikipedia.org/wiki/Paging (2认同)

And*_*ron 8

所有这些都进入了记忆.现在,"在内存中"的定义取决于操作系统,编译器和链接器选项,可执行格式以及其他一百万个因素.

在许多现代操作系统上,当创建进程时,可执行文件被映射到内存中(这意味着为可执行文件保留了内存区域,但并不意味着可执行文件已在该位置加载).

某些操作系统会在访问时加载部分可执行文件(请参阅"延迟加载"),这对于动态加载的库(Windows上的DLL和类UNIX系统上的共享对象)更常见.这主要影响函数的当前"位置",它们要么"在磁盘上"作为可执行文件,要么"在内存中"如果已经映射了可执行文件的那部分.

变量和所有其他程序数据进入内存.但是,任何使用虚拟内存操作的操作系统都可以在方便时将所有程序的运行状态(包括堆栈和堆)交换到磁盘,然后再将其还原以继续运行程序.

总之,列表中的所有项目(变量,函数等)都在内存中,但可能始终不会存储在"物理RAM"中.