什么时候为程序分配内存?

when is the memory allocated for programs?

我了解C++程序的内存分配过程。根据我从互联网上得到的信息,对于 C++ 编译器,内存是在编译时为全局变量和静态变量分配的。而动态创建的变量(例如 new/malloc 操作)只有在可执行文件实际上是 运行 时才会在内存中给出 space。如果我在这里错了,请纠正我。

如果可执行文件从未执行过,那么之前在编译时为全局变量和静态变量分配的内存部分是否会一直保留在内存中,直到计算机关闭?如果我们关闭 PC 并重新启动它,然后重新执行可执行文件会怎样?这次没有编译过程,OS什么时候为这个程序的全局变量和静态变量分配内存?是在系统启动阶段,还是真正执行可执行文件的时候?

现在将此问题扩展到 PC 中的任何通用程序。例如 Microsoft Word 程序。我们没有自己编码编译,只是从它的安装包中安装,所以这种情况下没有编译过程(也可能安装过程就是编译过程)。假设这些通用程序在内存中也需要space用于静态&全局变量,那么OS什么时候为这些程序分配内存呢?是在我们启动并启动 OS 时,还是在我们实际执行这些程序的可执行文件时?如果 OS 在启动时预加载所有这些静态变量,这就解释了为什么 OS 启动过程需要一些时间,但如果 90% 的启动过程似乎是内存资源的浪费系统中安装的程序不会在用户每次开机和使用他的电脑时执行。

编译器本质上是将所有静态内容和代码编译成保存在磁盘上的图像,例如在 Windows 等

上的 exe 文件中

当你运行它时,操作系统会分配一些内存并基本上将这个图像复制到 ram 中,然后开始 运行ning 编译代码,它也被复制到 ram。

您在程序中动态分配的内存是在程序执行时分配的。

编译时没有为您的程序分配内存。语句 "memory is allocated at compile time" 是概念上的简化。 really 的意思是,存储在编译文件中的初始内存映像是在编译时构建的。在程序实际 运行.

之前,它不会被加载到 ram 中

这非常简单,但却是一般要点。查看系统上二进制文件格式的文件格式规范以获得一些更有趣的提示 (for example) 等。