tra*_*l99 3 c memory-management compile-time
我想我有一堆愚蠢的问题一直困扰着我,我在任何地方都找不到令人满意的答案,所以不妨在这里提问并被鄙视,而不是让它在我的脑海中浮现。我会直接说的。
如果我有一些变量和数组(在编译时已知其大小),在函数内部,如果根本没有调用该函数,它是否仍然被分配?
这与 .c 文件和 .out 可执行文件的大小有何关系?
我在哪里可以找到这样的东西?您知道,一些优秀的编程书籍不仅教授语言,还教授内存中的基本工作原理。
- 如果我有一些变量和数组(在编译时已知其大小),在函数内部,如果根本没有调用该函数,它是否仍然被分配?
规范说什么
如果您static在函数内声明对象,则它们存在并在程序的整个生命周期内保留其值。每个这样的变量只有一个副本,无论函数被调用多少次,甚至与并发和递归调用无关。
如果您static在函数内声明非对象,则最内层包含块的每个执行都会获得其自己的副本,并且当与其关联的块执行终止时,每个这样的副本将不复存在。
你在实践中可能看到的
允许 C 实现在许多方面偏离规范的细节,只要它们产生相同的可观察行为,就好像它们完全遵循规范一样。您可能会看到的差异包括
如果编译器确定永远不能调用给定的函数,则可以省略整个函数及其声明的任何变量。
如果编译器确定给定的变量永远无法读取,那么该变量和对其的任何写入都可能被完全省略(除非它是volatile)。
原则上,在第一次访问静态变量之前,程序可能不会分配或初始化它们(尽管这不太可能)。
尾递归函数调用可以折叠成迭代,这样函数的局部变量会被重用,而不是为每次递归调用创建新的变量。
- 这与 .c 文件和 .out 可执行文件的大小有何关系?
.c 源文件由您编写的代码组成。如果您编写更多代码,则它会更大。如果你写的代码更少,那么它就会更小。
也许您的意思是目标文件(Unix 约定的 .o)。规范没有讨论这里的问题,甚至根本没有直接讨论这些文件。在实践中,实现各不相同,但编译器保留的所有局部变量的共同点是,只有那些static使用非零初始值设定项声明的变量才会占用目标文件、二进制库或可执行文件中的空间。
- 我在哪里可以找到这样的东西?您知道,一些优秀的编程书籍不仅教授语言,还教授内存中的基本工作原理。
抱歉,这部分问题与 Stack Overflow 无关。我们不解决征求场外材料建议的问题,包括但不限于教科书和教程。