对于这些实例,有人可以说一下C ++运行时的运行情况(Harddrive,RAM,Stack或Heap):
本地/全局变量
课程,方法和功能
指针
物件
Stack / Heap是否都位于物理RAM中?
如果有人可以在答案中包含硬件类比,我将不胜感激。 感谢。
答案 0 :(得分:13)
这通常依赖于OS ,但通常是这样的:
一切都进入了RAM。二进制文件驻留在硬盘驱动器中,但是,当运行时,它与相关库一起完全加载到RAM中。
堆栈和堆是实现细节,但它们也驻留在RAM中。
虽然加载到RAM中,但内存不能直接寻址。操作系统为每个进程分配虚拟内存。这意味着地址0x001
实际上并不位于RAM中的0x001
,而是代表虚拟地址空间中的地址。
编辑:对其中一条评论的澄清:
运行时是否完全或部分加载了二进制文件?并且,这些二进制文件是仅在运行时访问过一次还是从Harddrive继续读取?
例如,在MS中,如果链接到库,它将在程序开始时在运行时完全加载。如果以编程方式加载它,通过LoadLibrary()
,它将在函数调用时加载到内存中,并可以从内存中卸载。
答案 1 :(得分:7)
所有这些都进入了记忆。现在,“在内存中”的定义取决于操作系统,编译器和链接器选项,可执行格式以及其他一百万个因素。
在许多现代操作系统上,创建进程时,可执行文件将映射到内存中(这意味着为可执行文件保留了内存区域,但并不意味着可执行文件已在该位置加载)。 / p>
某些操作系统会在访问时加载部分可执行文件(请参阅“延迟加载”),这对于动态加载的库(Windows上的DLL和类UNIX系统上的共享对象)更常见。这主要影响函数的当前“位置”,它们或者作为可执行文件“在磁盘上”,或者如果已经映射了可执行文件的那部分,则“在内存中”。
变量和所有其他程序数据进入内存。但是,任何使用虚拟内存操作的操作系统都可以在方便时将所有程序的运行状态(包括堆栈和堆)交换到磁盘,然后再将其还原以继续运行程序。
总之,列表中的所有项目(变量,函数等)都在内存中,但可能无法始终存储在“物理RAM”中。
答案 2 :(得分:0)
在C ++中,当你保存程序时,它会进入硬盘驱动器,当你开始编译并执行程序时它会进入主存储器(RAM)。所有堆栈和堆内存都是ram内存的一部分。
根据程序和函数调用中的变量声明分配内存。默认堆栈大小为2 MB(来自谷歌搜索),它存储程序的所有本地变量。
堆包含在运行时创建的所有数据,意味着通过malloc
或new