【问题标题】:when is the memory allocated for programs? [closed]什么时候为程序分配内存? [关闭]
【发布时间】:2015-03-01 04:16:48
【问题描述】:

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

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

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

【问题讨论】:

  • 编译时没有分配内存。内存分配从运行时开始。
  • 我认为这个问题很清楚,并且与编程有关,如果有点漫不经心和幼稚(但没关系)。这背后显然是有想法的,这对于这些天这里的大多数问题来说都是可以说的。比“为什么我的程序崩溃”要好得多。不过我可能有点偏见。
  • @JasonC:它太宽泛了。 OP应该读一本开花的书。我们不能在这里教所有编译器是如何工作的。可能有“背后的想法”,但零研究。
  • 好吧,我投了我的重新开始投票。剩下的就看命运了。祝你好运,勇敢的问题!

标签: c++ memory allocation


【解决方案1】:

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

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

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

在编译时没有为您的程序分配内存。语句“内存在编译时分配”是概念上的简化。 真正的意思是存储在编译文件中的初始内存映像是在编译时构建的。在程序实际运行之前,它不会被加载到 ram 中。

这是非常简化的,但是是一般要点。查看系统上二进制文件格式的文件格式规范,了解更多有趣的提示 (for example)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2013-11-24
    • 2013-03-17
    • 2015-09-15
    相关资源
    最近更新 更多