您的位置:首页 > 编程语言 > C语言/C++

C++Primer Plus 第九章-存储持续性、作用域和链接性

2015-09-13 20:20 295 查看
C++Primer Plus 第九章-存储持续性、作用域和链接性
1)自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放。C++有两种存储持续性为自动的变量。

2)静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态。它们在程序整个运行过程中都存在。C++有3种存储持续性为静态的变量。

3)线程存储持续性(C++11):当前,多核处理器很常见,这些CPU可同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local声明的,则其生命周期与所属的线程一样长。本书不探讨并行线程。

4)动态存储持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。这种内存的存储持续性为动态,有时被称为自由存储或堆。

作用域:描述了名称在文件的多大范围内可见。链接性描述了名称如何在不用单元间共享。链接性为外部的名称可在文件间共享,链接性为内部的名称只能由一个文件中的函数共享。自动变量的名称没有链接性,因为它们不能共享。

作用域为局部的变量只在定义它的代码块中可用。作用域为全局(也叫文件作用域)的变量在定义位置到文件结尾之间都可用。自动变量的作用域为局部,静态变量的作用域是全局还是局部取决于它如何被定义的。在名称空间声明的变量的作用域为整个名称空间。因此,全局作用域是名称空间作用域的特例。

C++函数的作用域可以是整个类或整个名称空间,但不能是局部的(因为不能在代码块内定义函数,如果函数的作用域是局部,则只对它自己是可见的,因此不能被其他函数调用)。

自动存储持续性:在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性。如果在代码块中定义了变量,则该变量的存在时间和作用域将被限制在改代码块中。

关键字auto:由于只能将关键字auto用于默认为自动的变量,因此程序员几乎不使用它。它的主要用途是指出当前变量为局部自动变量。如:auto float ford;

寄存器变量register:该关键字只是显式地指出变量是自动的。鉴于关键字register只能用于原来就是自动的变量,使用它的唯一原因是指出程序员想使用一个自动变量,这个变量的名称可能与外部变量相同。

静态持续变量:由于静态变量的数目在程序运行期间是不变的,因此程序不需要使用特殊的装置(如栈)来管理它们。编译器将分配固定的内存块来存储所有的静态变量,这些变量在整个程序执行期间一直存在。另外,如果没有显式地初始化静态变量,编译器将把它设置为0。在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0。

要想创建链接性为外部的静态持续性变量,必须在代码块的外面声明它;要创建链接性外内部的静态持续性变量,必须在代码块的外面声明它,并使用static限定符;要创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static限定符。

零初始化和常量表达式初始化被统称为静态初始化,这意味着在编译器处理文件(翻译单元)时初始化变量。动态初始化意味着变量将在编译后初始化。

声明:不分配存储空间;定义:分配存储空间。

关键字extern:如果要在多个文件中使用外部变量,只需要在一个文件中包含该变量的定义(单定义规则),但再使用该变量的其他所有文件中,都必须使用关键字extern声明它。

全局变量和局部变量:全局变量很有吸引力--因为所有的函数能访问全局变量,因此不用传递参数。但是易于访问的代价很大----程序不可靠。计算表明,程序越能避免对数据进行不必要的访问,就越能保持数据的完整性。通常情况下,应使用局部变量,应在需要知晓时才传递数据,而不应不加区分地使用全局变量来使数据可用。在数据隔离方面有帮助。外部存储尤其适用于表示常量数据,因为这样可以使用关键字const来防止数据被修改。

static限定符:在代码块中使用static时,将导致局部变量的存储持续性为静态的。这意味着虽然该变量只在该代码块中可用,但它在该代码块不处于活动状态时仍然存在,因此在两次函数调用之间,静态局部变量的值将保持不变(静态变量适用于再生,可以用它将瑞士银行的秘密账号传递到下一个要去的地方)。另外,如果初始化了静态局部变量,则程序只在启动时进行一次初始化。以后再调用函数时,将不会像自动变量那样再次被初始化。

关键字volatile:作用是为了改善编译器的优化能力。

register:寄存器存储,显式指出变量是自动的。

auto:指出变量为自动变量。

static:限定符。

extern:声明引用在其他地方定义的变量。

mutable:即使结构(或类)变量为const,其某个成员也可以被修改。

函数和链接性:在默认情况下,函数的链接性为外部的。即可以再文件间共享。实际上,可以在函数原型中使用关键字extern来指出函数实在另一个文件中定义的。还可以使用关键字static将函数的链接性设置为内部的。使之只能在一个文件中使用。必须同时在声明中和定义中使用该关键字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: