函数与变量的内存存储方案

本段内容整理自《C++ Primer第五版中文版》第9章:内存模型与名字空间

编译器通常使用三块独立的内存存储变量:一块用于静态持续变量,一块用于自动变量,一块用于动态存储。

静态持续变量有以下几种:

  • 全局变量:在所有文件中使用
  • 全局静态变量:在当前文件中使用
  • 局部静态变量:在当前函数中使用

全局变量

全局变量定义在main()函数外部,其它文件要使用这个变量的,需要用关键字extern;全局静态变量仅在当前文件中使用,需要用关键字static;局部静态变量同样用关键字static,但是作用域为声明这个变量所在函数,局部静态变量不会随着函数结束而消失,而是处于不活动状态,当这个函数再次被调用时,这个变量能继续使用。

以下代码示例描述了这三种静态持续变量。

 1 ...
 2 int global = 1000; // 全局变量
 3 static int one_file = 50; // 全局静态变量
 4 void funct(int n) {
 5     static int func_val = 0; // 局部静态变量
 6     ...
 7 }
 8 int main() {
 9     ...
10 }

自动变量

指用关键字auto声明的变量,以及int,float,char等关键字声明的有明确存储类别的变量。

程序在运行时,留出一段内存视为对战,以管理变量的增减。新变量被放在原有变量的上面,变量所在作用域的函数结束后,程序将其从堆栈中删除。堆栈是LIFO(后进先出)的,最后加入到堆栈的变量最先被弹出。程序使用两个指针来跟踪堆栈,一个指针指向栈底——堆栈开始位置,一个指针指向栈顶——下一个可用内存单元。

动态变量

动态变量由newdelete关键字分配和释放内存。

类中的静态变量

它与局部静态变量类似,只是它的作用域不是函数,而是类。它与其它静态持续变量存储在一起,而不是存储在对象中,因此它被所有对象共享。

1 class Stock {
2 private:
3     static const int Len = 30; // 类中的静态变量
4     char company(Len);
5     ...
6 };

函数存储

函数的存储都自动设为静态的,在整个程序执行期间都一直存在。默认情况下,函数可以在文件间共享,用extern关键字声明函数在另一个文件中定义。使用static关键字将函数设为只能在一个文件中使用。

1 // 此函数只能在这个文件中使用
2 static int private(double x);
3 ...
4 static int private(double x);
5 {
6     ...
7 }

编译器查找函数的过程:如果函数是static,在当前文件中查找;否则,先找所有程序文件,再找库。

posted @ 2015-11-30 16:36  cleverc  阅读(636)  评论(0编辑  收藏  举报