编译时分配的数据结构?

data structures allocated at compile time?

我想我有一堆愚蠢的问题一直困扰着我,我在任何地方都找不到真正令人满意的答案,所以还不如在这里问并被人看不起,而不是让它在我的脑海中浮现.我马上开始。

  1. 如果我在一个函数中有一些变量和数组(其大小在编译时已知),如果根本不调用该函数,它是否仍然被分配?

  2. 这与 .c 文件和 .out 可执行文件的大小有什么关系?

  3. 我在哪里可以找到这些东西?要知道,一些很好的编程书籍,不仅会教授语言,还会记忆底层的工作原理。

  1. If I have some variables and arrays (whose size is known at compile time), inside a function, is it still allocated if the function is not called at all?

规格说明

如果您在函数内声明 static 个对象,那么它们将存在并在程序的整个生命周期内保留它们的值。每个这样的变量只有一个副本,无论函数被调用多少次,甚至不管并发和递归调用。

如果你在一个函数中声明非static对象,那么最里面的包含块的每次执行都会得到它自己的每个副本,并且当它所在的块执行时,每个这样的副本都不复存在关联终止。

你可能会在实践中看到什么

C 实现在许多方面都允许偏离规范的细节,只要它们产生相同的可观察行为,就好像它们严格遵守规范一样。您可能会看到的差异包括

  • 如果编译器确定永远无法调用给定函数,则可以省略整个函数及其声明的任何变量。

  • 如果编译器确定给定的变量永远无法读取,那么该变量和对其的任何写入都可能被完全省略(除非它是 volatile)。

  • 原则上,程序可能不会分配或初始化静态变量,直到它们被首次访问(尽管这不太可能)。

  • 尾递归函数调用可能会折叠成迭代,这样函数的局部变量就会被重新使用,而不是为每个递归调用创建新的局部变量。

  1. How does this relate to the size of the .c file and the .out executable?

.c 源文件由您编写的代码组成。如果您编写更多代码,那么它会更大。如果你写的代码越少,它就越小。

也许您指的是对象文件(按 Unix 约定的 .o)。规范没有说明这里的问题,甚至根本没有直接说明这些文件。在实践中,实现各不相同,但在编译器保留的所有局部变量中,只有 static 且使用非零初始值设定项声明的局部变量在目标文件、二进制库或可执行文件中占用 space 是很常见的文件。

  1. Where can I find stuff like these? You know, some good programming books that not only teach the language, but also the underlying working principles in memory.

抱歉,这部分问题与 Stack Overflow 无关。我们不解决征求站外材料建议的问题,包括但不限于教科书和教程。

如果你用大小声明了你的变量,比如

int a[10];

这意味着将从堆栈中使用内存。这是在编译时分配的(静态)。

通常,如果您不调用某个函数,编译器的预处理器会删除该代码。所以你可能不会仅仅因为你的编译器很聪明而注意到内存使用的差异。

.C 和 .OUT 文件只是带有命令的文件,不会受内存影响 declarations.But,如果您的代码中有宏之类的东西,这可能会增加一次大小 compiled.You 可以阅读内存管理器、动态和静态内存(堆和堆栈)以获得更好的理解