一位经验丰富的C开发人员告诉我,静态变量的概念与静态内存分配的概念不同。它是否正确?如果是这样,这两个概念之间有什么区别?
静态内存分配的正式定义是什么?它与静态变量的正式定义有何不同?
这个问题涉及这些概念如何仅映射到C编程语言。
答案 0 :(得分:2)
基本上,静态变量是使用静态内存分配分配内存的变量。
这些术语的以下用法支持:
GNU的libc manual。
- 静态分配是指声明静态或全局变量时发生的情况。每个静态或全局变量定义一个固定大小的空间块。当你的程序启动时(exec操作的一部分),空间被分配一次,并且永远不会被释放。
- 当您声明自动变量(例如函数参数或局部变量)时,会发生自动分配。输入包含声明的复合语句时会分配自动变量的空间,并在退出该复合语句时释放。在GNU C中,自动存储的大小可以是变化的表达式。在其他C实现中,它必须是常量。
K&R second edition,附录A,第4.1节“存储类”
有两种存储类:自动和静态。几个关键字与对象声明的上下文一起指定其存储类。自动对象是块的本地对象(参数9.3),并在从块退出时被丢弃。如果未提及存储类规范,或者使用了自动说明符,则块内的声明会创建自动对象。声明寄存器的对象是自动的,并且(如果可能的话)存储在机器的快速寄存器中。
静态对象可以是块的本地对象,也可以是所有块的外部对象,但在任何一种情况下,都可以在退出和重新进入函数和块的过程中保留它们的值。在块中,包括提供函数代码的块,静态对象使用关键字static声明。在所有块之外声明的对象与函数定义处于同一级别,它们始终是静态的。可以使用static关键字将它们设置为特定翻译单元的本地;这给了他们内部的联系。通过省略显式存储类或使用关键字extern,它们成为整个程序的全局;这给了他们外在的联系。
这似乎证实了等值。
Compilers, Principles, Techniques & Tools第7.1.1节静态与动态存储分配
两个形容词 static 和 dynamic 分别区分编译时和运行时。
Operating Systems, A concept based approach D M Dhamdhere,第194页
定义5.1(静态和动态绑定)静态绑定是在程序(或软件系统)操作开始之前执行的绑定,而动态绑定是在其操作期间执行的绑定。 / p>
[...]
静态和动态内存分配在读取程序执行时,编译器,链接器或加载程序可以执行静态内存分配。动态内存分配以惰性方式执行。也就是说,在程序执行期间第一次使用实体时,就会将内存分配分配给实体。
[...]
静态内存分配在程序执行期间不需要任何内存分配操作。相反,动态分配会导致在程序执行期间执行的内存分配动作的开销。在执行程序期间,其中一些操作甚至会重复多次。
Programming in C - A Practical approach。第7.7节,概念问题和答案,第25页第444页
运行时(即程序执行时)的内存分配称为动态内存分配。在C中,可以通过调用
malloc
,calloc
或realloc
函数动态分配内存。编译时的内存分配称为静态内存分配
接下来是一个表格,更详细地解释了差异。您可以see it in google books
Memory as a Programming Concept in C and C++第15页:
[...]因此我们谈到静态内存分配或(编译时的内存分配或编译器的内存分配 )严格来说,编译器在程序运行时不会分配任何内存。甚至可能是这样的情况,当程序运行时,用于编译程序的编译器不再存在。
Wikipedia确认两个概念之间的等价关系:Static memory allocation和Static Variable都互相引用,并明确说明静态变量是静态分配的变量。