我理解C ++程序的内存分配过程。根据我从互联网上获得的内容,对于C ++编译器,在编译时为内核分配全局变量和静态变量。虽然动态创建的变量(例如new / malloc操作)仅在可执行文件实际运行时才会在内存中获得空间。如果我在这里错了,请纠正我。
如果永远不会执行可执行文件,那么先前在编译时为全局&分配的内存部分也是如此。在计算机关闭之前,静态变量仍将始终位于内存中?如果我们关闭PC并重新启动它然后重新执行可执行文件怎么办?这一次,没有编译过程,操作系统何时为全局&分配内存。这个程序的静态变量?它是在系统启动阶段,还是在可执行文件实际执行时?
现在将此问题扩展到PC中的任何常规程序。例如Microsoft Word程序。我们没有自己编写和编译它,我们只是从它的安装包安装它,因此在这种情况下没有编译过程(或者安装过程实际上是编译过程)。假设这些通用程序在内存中还需要空间用于静态和全局变量,操作系统何时为这些程序分配内存?是在我们启动并启动操作系统时,还是在我们实际执行这些程序的可执行文件时?如果操作系统在引导时预先加载所有这些静态变量,那么这就解释了为什么操作系统启动过程需要一些时间,但如果系统中安装的90%的程序不是,那么这似乎是浪费内存资源每次用户启动并使用他的PC时执行。
答案 0 :(得分:6)
编译器基本上将所有静态内容和代码编译成保存在磁盘上的图像,例如:在Windows等exe文件中
当你运行它时,操作系统会分配一些内存并基本上将这个映像复制到ram中,然后开始运行编译后的代码,这些代码也被复制到ram中。
您在程序中动态分配的内存将在程序执行时分配。
在编译时没有为您的程序分配ram。语句"内存在编译时分配"是概念上的简化。 真正的含义是存储在编译文件中的初始内存映像是在编译时构建的。在程序实际运行之前,这不会被加载到ram中。
这是非常简化的,但是一般的要点。查看系统上二进制文件格式的文件格式规范,以获得更有趣的提示(for example)等。