【问题标题】:How much memory takes a C program [closed]C程序需要多少内存[关闭]
【发布时间】:2014-12-10 11:17:57
【问题描述】:

我正在开发一个内存数据库作为一个应该是轻量级的副项目。我从学校开始就没有学过 C,而且我对计算机架构的了解有限......

我想知道如何准确计算我的程序将占用多少内存以及来自哪种内存(RAM、寄存器、...)。 最明显的是我通过 malloc 分配的所有内容。对不起,如果以下问题有点随机......

  1. 全局变量将存储在 RAM 中吗?关键字 static(限制范围)是否有影响?
  2. 是所有全局变量同时分配还是在首次访问时延迟分配?
  3. 可执行文件是否已加载到内存中? 1MB 的可执行文件是否需要 1MB 来执行?

这个主题相当大,所以不要犹豫,给我指一本书或一个网站。我想这不仅仅是关于 C 语言,还有更多关于计算机体系结构、汇编代码等。

【问题讨论】:

  • 我很惊讶拥有 2k 代表的会员会问这样的问题。请具体
  • 如果您使用的是现代桌面操作系统,则可执行文件中的所有部分都映射到进程内存映射中,但文件的所有部分或部分实际上都不是被加载到内存中,当它被加载到内存中时,程序及其分配的内存可能根本不在 RAM 中,而是换出到磁盘中(它全部在“内存”中,但不在 RAM 内存中)。
  • 另请参阅 C 程序的内存布局
  • 此链接描述了 C 程序的内存布局,并包含指向相关材料的更多链接。 geeksforgeeks.org/memory-layout-of-c-program
  • @darknight 我是一个非常优秀的 Java 开发人员,但显然是一个糟糕的 C 程序员。内存并不是你在 Java 中首先关心的问题^^

标签: c memory assembly memory-management


【解决方案1】:

我假设的是典型的计算平台,而不是嵌入式系统。

全局变量会存储在 RAM 中吗?关键字 static (限制范围)会影响什么吗?

仅当操作系统认为这是 RAM 的最佳用途时,全局变量才会存储在 RAM 中。范围无效。

所有全局变量是同时分配的,还是可以在首次访问时延迟分配?

这取决于您所说的“已分配”是什么意思。通常虚拟内存(地址空间)是一次性分配的,但物理内存 (RAM) 是根据需要分配的。

可执行文件是否加载到内存中? 1MB 的可执行文件是否会占用 1MB 的执行空间?

它在程序启动时被映射到内存中。它实际上是根据需要加载到物理内存中,并在操作系统认为合适时从物理内存中逐出。

我强烈怀疑您正在寻找非常复杂问题的简单答案。

【讨论】:

  • 你强烈怀疑是对的!我刚开始只需要几个指针......
【解决方案2】:
  1. 是的,但这并不意味着它们在任何给定时间点都映射
  2. 它们不能被延迟分配,这取决于你的意思。它们都将映射到虚拟地址,但如果程序从不访问变量,操作系统可能永远不需要将这些地址映射到实际的物理 RAM。
  3. 这取决于,但我认为大多数现代桌面/服务器操作系统会根据需要将代码分页。

【讨论】:

    【解决方案3】:

    哎呀,这是一个有趣的问题,但答案和往常一样:这取决于!

    您的问题在很大程度上取决于实施。在旧的(现在已经过时的)系统中,存在覆盖的概念:部分代码仅在需要时才加载到内存中。我不认为它仍然用于现代虚拟内存系统,但它可能对资源有限的嵌入式系统有意义。

    并且一些编译器通常具有确定堆栈大小的选项。它可能是轻量级程序的决定因素。

    并且对架构有明显的依赖性:在 Unix-Linux 上,您有 elf 与 a.out 格式,它们具有不同的内存要求和管理,在 Windows 上,仍然有旧的 .com 格式可以导致非常小的可执行文件.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多