C++内存模型及命名空间

五种变量

1、 自动变量
在函数内定义的局部变量,保存在对应的函数栈中,随着函数的调用结束而销毁。
2、 寄存器变量
由关键字register修饰的自动变量,通过建议编译器使用cpu中的寄存器来保存自动变量。
由于硬件的发展该关键字的修饰并不会对真正使用寄存器,c++11中仍保留该关键字,但并不起任何作用。
3、 静态持续性,外部链接性
通常称为全局变量或外部变量,其作用域为工程作用域,持续性为静态。
单定义规则:同工程下不可重复定义,在本文件中称为定义声明,为变量开辟内存空间,在外部文件中使用extern 声明称为引用声明。
同名覆盖原则:全局变量或外部变量可被同名的局部变量覆盖,当处于同名局部变量的作用域内无法通过变量名访问该全局变量。
4、 静态持续性,内部链接性
通常称为静态全局变量,其作用域为文件作用域,持续性为静态,通过关键字static 定义的全局变量。
无法由extern引出,可以和外部变量重名,由于其作用域为本文件可见,并不影响外部变量的单定义规则,可覆盖与其同名的外部变量。
遵循同名覆盖原则。
5、 静态持续性,无连接性
通常称为静态局部变量,作用域为函数作用域,持续性为静态。由关键字static修饰的局部变量。
仅在程序启动时初始化,以后再调用函数并不会像自动变量一样初始化。
*自动变量是在代码段中,在编译时不产生符号,仅是代码段的一部分无法称为数据。
而持续为静态的变量,会在编译是产生符号,存储于数据段,称之为数据。*
说明符和限定符
1、 存储说明符
 auto:用于声明对象为自动变量,在c++11中用来自动类型推断
 register:建议编译器使用寄存器存储变量,c++11中为显示声明变量为自动变量
 static:用于局部变量表示其持续性为静态用于全局变量时表示链接性为内部
 thread_local:由该修饰符修饰的变量持续性与该变量所属线程的持续性相同
 mutable:用与修饰结构体或类中的某个成员,即使该结构体变量或对象被const修饰,被mutable修饰的成员仍可被修改。
2、c-v限定符
const限定符
修饰的变量被称为常变量,一经初始化后无法再修改。
volatile限定符
被修饰的变量可能由于其他原因被改变,每次是勇士需要直接访问该变量的
内存空间,而不是去访问由编译器优化的缓存中。使用volatile限定符使编译器不对这个变量进行优化。

名称空间

1、 声明区域和潜在作用域
声明区域是指一个变量或函数可以在其中声明的区域。潜在作用域是指声明点到声明区域结束的范围内。但变量的可见性会因为其潜在作用域中是否存着同名覆盖的局部变量而影响。
2、 使用namespace 创建名称空间
可以在全局,或是另一个名称空间内创建名称空间,但不能在代码块中创建名称空间。
名称空间的可以通过namespace 向已有的名称空间中增加新名称。
3、 using 声明和 using 编译指令
using声明:由被限定的名称和关键字 using组成,用来向另一个名称空间中声明另一个名称空间中的名称。
using编译指令:使用namespace关键字和 using关键字,把对应名称空间中的所有名称在当前名称空间中声明。
using编译指令添加的两个名称空间的同名名称,不存在二义性,但在使用名称时必须加上对应的名称空间和作用域限定符:: 。
编译器不允许使用using声明声明两个同名但名称空间不同的名称。

五种变量的具体说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值