C++数据存储类型

1 自动存储持续性


在默认情况下,在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性。也就是说,如果在main()中声明了一个名为texas的变量,并在函数oil()中也声明了一个名为texas变量,则创建了两个独立的变量——只有在定义它们的函数中才能使用它们。另外,当程序开始执行这些变量所属的代码块时,将为其分配内存,当函数结束时,这些变量都将消失。

(1)自动变量的初始化

可以使用任何在声明时其值已知的表达式来初始化自动变量。

(2)自动变量和栈

了解典型的C++编译器如何实现自动变量有助于更深入的了解自动变量。由于自动变量的数目随函数的开始和结束而增减,因此程序必须在运行时对自动变量进行管理。常用的方法是留出一段内存,并将其视为栈,以管理变量的增减。之所以被称为栈,是由于新数据被象征性地放在原有数据的上面(也就是说,在相邻的内存单元中,而不是在同一个内存单元中),当程序使用完后,将其从栈中删除。栈的默认长度取决于实现,但编译器通常提供改变栈长度的选项。

(3)寄存器变量

关键字register最初是由C语言引入的,他建议编译器使用CPU寄存器来存储自动变量;
register int count_fast;
这旨在提供访问变量的速度。

2 静态持续变量

和C语言一样,C++也为静态存储持续性变量提供了3种链接性:外部链接性(可在其他文件中访问)、内部链接性(只能在当前文件中访问)和无链接性(只能在当前函数或代码中访问)。这3种链接性都在整个程序执行期间存在,与自动变量相比,它们的寿命更长。由于静态变量的数目在程序运行期间是不变的,因此程序不需要使用特殊的装置(如栈)来管理它们。编译器将分配固定的内存块来存储所有的静态变量,这些变量在整个程序执行期间一直存在。另外,如果没有显示地初始化静态变量,编译器将把它设置为0。在默认情况下,静态数组和结构将每个元素或成员的所有位都设置为0。

所以的静态持续变量都有下述初始化特征:未被初始化的静态变量的所以位都被设置为0。这种变量被称为零初始化的。

3 静态持续性、外部链接性

链接性为外部的变量通常简称外部变量,它们的存储持续性为静态作用域为整个文件。外部变量是在函数外部定义的,因此对所有的函数而言都是外部的。可以在文件中位于外部变量定义后面的任何函数中使用它,因此外部变量也称为全局变量(相对于局部的自动变量)。

1)单定义规则

一方面,在每个使用外部变量的文件中,都必须声明它;另一方面,C++有“单定义规则”,该规则指出,变量只能有一次定义。为满足这种需求,C++提供了两种变量声明。一种是定义声明或简称为定义,它给变量分配存储空间;另一种是引用声明或简称为声明,它不给变量分配存储空间,因为它引用已有的变量。

引用声明使用关键字extern,且不进行初始化;否则,声明为定义,导致分配存储空间:
double up; 定义
extern int blem;声明
extern char gr='z';定义

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


请注意,单定义规则并非意味着不能有多个变量的名称相同。例如,在不同函数中声明的同名自动变量是彼此独立的,它们有自己的地址。另外,正如后面的示例将表明的,局部变量是可能隐藏同名的全局变量。然而,虽然程序中看包含多个同名的变量,但每个变量都只有一个定义。
但是C++比C语言更进一步——它提供了作用域解析运算符(::)。放在变量名前面时,该运算符表示使用变量的全局版本。


4 静态持续性、内部链接性

将static限定符用于作用域为整个文件的变量时,该变量的链接性将为内部的。在多文件程序中,内部链接性和外部链接性直接的差别很有意义。链接性为内部的变量只能在其所属的文件中使用;但常规外部变量都具有外部链接性,即可以在其他文件中使用。

注意:在多文件程序中,可以在一个文件中(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用关键字extern声明它。

可使用外部变量在多文件程序的不同部分之间共享数据;可使用链接性为内部的静态变量在同一文件中的多个函数之间共享数据(名称空间提供了另外一种共享数据的方法),另外,如果将作用域为整个文件的变量变为静态的,就不必担心其名称与其他文件中的作用域为整个文件的变量发生冲突。

5 静态存储持续性、无链接性

无链接性的局部变量,这种变量是这样创建的,将static限定符用于在代码块中定义的变量。在代码块中使用static时,将导致局部变量的存储持续性为静态的。这意味着虽然该变量只在该代码块中可用,但它在该代码块不处于活动状态时仍然存在。因此在两次函数调用之间,静态局部变量的值保持不变。另外,如果初始化了静态局部变量,则程序只在启动时进行一次初始化。以后再调用函数时,将不会像自动变量那样再次被初始化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值