static 变量的思考

最近心思来潮,重新温习一下基本的编程知识。

有一些工作中一直有涉及的知识,虽然有个大概的概念,但是却无法阐述其基本的原理。例如 static 关键字。

一般人使用 static 关键字,是为了使用它的暂存器功能,也就是在函数内,static 关键字修饰的变量,在函数结束后,变量并没有被释放,下次再调用此函数时,变量依然保持上次的值,而不会被重新初始化。这是 static 关键字功能的其中之一。

这里总结一下所有功能:

  1. 在函数体内,一个被声明为静态的变量在这一函数被调用过程中,不会被重新初始化,下次再调用此函数时,变量依然保持上次的值。
  2. 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
  3. 模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
  4. 还有一个,在 JAVA 中,有第四种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数。MyClass.staticMethod() 的调用方法是不是与第3种功能有所矛盾,这个是经常引起误导的地方。 

另外,关于 static 的存储空间,也总结一下:

static 变量和 普通全局变量一样,都是存放于静态存储区。

顺便说说数据的存储,可分为三类:静态存储(static storage);自动存储(automatic storage);动态分配存储(allocated or dynamic storage)。 对于自动存储则对应的是栈(stack),动态分配存储对应的是堆(heap)。栈(stack)对应函数调用时存放函数的参数值;而堆(heap)则有程序员自己申请,释放。

最后要说的时候,所谓的3种存储方式,存取区域,对于芯片来说,都是单纯的内存地址。当初做过汇编开发,对此有所了解,全局存储区,堆和栈都是自己来划分。而C语言可以通过配置编译器配置文件来定义堆栈的大小。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据