存储持续性性,作用域,链接性
C++使用三种(C++11使用四种)不同的方案来存储时间,四种方案的区别就是数据保留在内存中的时间
- 自动存储连续性:在函数定义中声明的变量(包括函数参数)的存储持续性性是自动的。它们在程序开始执行其所属的函数或者代码的时候被创建,在执行完函数或者代码块的时候被释放,C++有两种存储持续性位自动的变量。
- 静态存储连续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态,它们在整个程序运行时都存在,C++有三种该类型的变量。
- 线程存储持续型(C++11):不展开讨论
- 动态存储持续性:用new运算符分配的内存将一直存在知道使用delete运算符将其释放,或者程序结束。这种内存持续性称为动态,有时被称为自由存储或者堆。
作用域和链接
作用域描述了名称在文件的多大范围是可见的
链接性描述了名称如何在不同文件(单元)内共享,链接性为外部的名称可以在文件间共享,链接性为内部的变量只能在同一个文件的函数共享。自动变量的名称没有链接性,所以他不能共享。
C++变量的作用域有多种
- 作用域为局部的变量只在定义它的代码块可用,代码块是用{}括起多行代码
- 作用域为全局(文件作用域)的变量在变量的定义位置到文件尾部都可以用。
- 自动变量的作用域为局部
- 静态变量的作用域取决他如何定义
- 在函数原型作用域中使用的名称只在包含参数列表的括号中可以用。
- 在类中声明的成员作用域为整个类。
- 在名称空间中声明的变量作用域是整个命名空间(由于名称作用域已经引入C++语言,所以全局作用域是名称空间作用域的特例)
自动存储持续性
在默认情况下,在函数定义中声明的变量(包括函数参数)的存储持续性性是自动的。作用域为局部,没有链接性,只有当程序执行到变量所在代码块时才为其分配内存,当函数结束时,这些变量都将消失。(这边注意,执行到代码块的时候为其分配内存,但是作用域的起点是其声明位置)
如果在代码块中定义变量那么其作用域和持续时间都限定在代码块中,如果一个变量名同时在内部代码块和外部代码块定义,我们说新的定义隐藏了旧的定义,新定义可见,当程序离开该代码块时,原来的定义又重新可见。(该规则也适用于命名空间)
在C++11中,auto用于类型推断,但是在C语言和C++之前的版本中他用于显示的指出变量为自动存储。用的人太少所以改了
自动变量的初始化:
可以使用任何在声明时其值为已知的表达式来初始化自动化变量
int a = 1;
int b = 2 * a;
自动变量与栈
由于自动变量的数目随着函数的开始和结束而增减,因此程序必须在运行时对自动变量进行管理,常用的方法是留出一段内存,将其视作栈,以管理变量的增减,子所以被称之为栈,是由于新数据被象征性的放在原有数据的上面,当程序使用完后,将其中栈中删除,栈的默认长度取决实现,但是编译器通常允许你定义长度。
寄存器变量
关键字register是由C语言引入的,他建议CPU寄存器来存储自动变量,这旨在提高变量的访问速度。
在C++11之关键字用法没有变化,这种提示表示这个变量用的很多,编译器可对其进行特殊处理,在C++11中,这种提示作用也失去了,关键词register只是显式的指出变量时自动的,而关键词register本来就只能用自动变量,保留register的原因就是不想让使用了该关键字的代码非法。