【问题标题】:Does #include increase the RAM usage?#include 是否会增加 RAM 使用量?
【发布时间】:2012-05-28 02:09:18
【问题描述】:

如果我包含更多头文件,是否会增加所需的 RAM 大小?例如,如果我 #include <stdio.h>#include <string.h> 需要更多 RAM 吗?

我正在用 CNU C 编译器编写一个嵌入式系统软件,所以我想尽可能减少所需的 RAM。

【问题讨论】:

  • 增加您正在编译的程序所需的 RAM 大小或增加编译器本身所需的 RAM 大小?
  • 我的意思是我正在编译的程序所需的RAM大小,我的微控制器只有64KB的内部RAM,我总是担心它会用完RAM,因为它很难调试...
  • 哇,首先,我认为我的问题似乎很愚蠢而且太琐碎,我想知道我应该问它....但现在我认为值得问这么多不同的答案和 cmets。 ..

标签: c memory heap-memory ram stack-memory


【解决方案1】:

您真正想问的答案可能是“否”,至少在您谈论标准库头文件时是这样。包括它们不会对可执行文件大小或内存占用产生影响。尽管如此,我还是忍不住给出了相反的回应:

这取决于您包含的文件中的内容。系统头文件不会这样做,但理论上,该文件中可以包含任何内容。标头仅包含函数原型和类型定义只是一种约定。如果我有这两个文件:

// foo.c
int bigarray[1000];

// bar.c
#include "foo.c"
int main(int argc, char**argv()) {
return 0;
}

这是合法代码,bar.c 可以很好地编译,但由于 foo.c 中的数组(如果编译器不优化它),我的内存占用可能会大 4K。

【讨论】:

  • 此代码不包含头文件。任何试图包含 .c 文件的人都只能责怪自己。除此之外,编译器不太可能在可执行文件中包含“bigarray”。
  • “头文件”是 C 中的一个约定。编译器不在乎你给文件起什么名字或者你在里面写了什么。另外,我确实说过我试图与之相反:-) 至于在可执行文件中不包括 bigarray,试试这个: gcc -o bar bar.c && nm bar | grep 大数组
  • 编译器接受什么并不重要,因为 OP 专门询问如果它们包含头文件并且您的代码没有这样做会发生什么,所以它没有回答这个问题。在未启用任何优化的情况下运行编译器也不重要。
  • 将 "foo.c" 重命名为 "foo.h",然后将 "#include \"foo.c\"" 更改为 "#include \"foo.h\""。 :P
【解决方案2】:

不,包含文件用于编译器;它们根本不影响生成代码的大小。

【讨论】:

    【解决方案3】:

    包含头文件仅在编译期间有效。它们用于告诉编译器在哪里可以找到他需要的实现。

    编译后的可执行文件不包含这些信息,因此不受包含数量的影响。

    这与 PHP 等解释性语言存在巨大差异,其中包含文件会增加内存使用量。但即使在 PHP 中,也有最小化内存使用的机制(包括一次文件,不包括未使用的包含...)

    【讨论】:

      【解决方案4】:

      没有。包含文件不是函数,它们是对系统函数的引用(至少对于编译器附带的那些)。如果您想亲自查看,请导航到编译器的include 目录并在文本编辑器中打开文件(但永远不要更改它们)。它们与您编写的任何其他.h 相同;它们没有定义任何函数。

      编译器将看到函数名(例如 printf)是有效的,并将其编译为目标文件。链接器负责将该名称转换为有效的系统调用。

      【讨论】:

      • 我看到你使用内核这个词。我不认为它意味着你认为它的意思。
      • 想知道同样的事情:) 我认为他的意思是“核心”。或者可能是我错了。系统函数是错误的,因为有些函数指向更高级别的函数。
      • @Enno 它只是在我编写的操作系统和我编写的链接器脚本中,它们是内核调用
      【解决方案5】:

      是的,我可能会增加二进制大小,然后增加 RAM 大小。 它有两种方式: 1.头文件有全局/静态变量定义 2.头文件即使不用于当前文件也有功能。但编译器可能仍会将它们保存在最终的二进制文件中。

      我说“可能增加”是因为如果编译器足够聪明,我可以只包含二进制所需的数据,而丢弃其他的。

      其他内容可能在头文件中,比如变量声明,typedef等。它们不会增加RAM,因为它只在编译时需要,而不是运行时需要。

      【讨论】:

      • 如果程序实际使用了这些全局变量/静态变量,编译器很可能只会将它们保留在最终的二进制文件中。此外,标准库头文件通常由熟练的专业程序员编写,因此您不会在头文件中找到任何全局/静态。
      • @Lundin 我说的是概率。我不是图书馆的作者,所以我不知道他们是怎么写的。你不是,所以你不知道以太。
      • Err... 实际上我知道。大多数编译器保持其头文件完全开源。
      【解决方案6】:

      是的,但只是略微......但它确实增加了 CPU 使用率。您可以在 Windows 任务管理器中查看它....

      【讨论】:

      • 我认为很明显 OP 意味着可执行文件的 RAM 消耗,而不是编译器的 RAM 消耗。此外,问题中没有任何内容表明代码是在 MS Windows 上编译的。
      猜你喜欢
      • 2011-09-15
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      相关资源
      最近更新 更多