本段内容整理自《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(后进先出)的,最后加入到堆栈的变量最先被弹出。程序使用两个指针来跟踪堆栈,一个指针指向栈底——堆栈开始位置,一个指针指向栈顶——下一个可用内存单元。
动态变量
动态变量由new
和delete
关键字分配和释放内存。
类中的静态变量
它与局部静态变量类似,只是它的作用域不是函数,而是类。它与其它静态持续变量存储在一起,而不是存储在对象中,因此它被所有对象共享。
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
,在当前文件中查找;否则,先找所有程序文件,再找库。