数据保留在内存中的时间长度被称为存储持续性
数据的作用域和链接性
- 作用域:数据可以被代码块引用的范围,能够引用某数据的代码块都是此数据的作用域
- 链接性:内部链接为当前文件可访问此数据,外部链接为:当前文件可访问,同时其他文件也可以访问。
c++名称空间:控制访问权限,与Java的包功能相同,用于多人协作。
C++的内存模型和名称空间
- 自动存储持续性:随定义位置的代码块生灭
- 静态存储持续性:随整个程序生灭 三种 : static 全局变量 块内static
- 线程存储持续性:随线程的创建与销毁生灭 用thread_local声明
- 动态存储持续性:随关键字 new 生 随关键字 delete 灭
自动变量使用栈实现
register :使被修饰的变量变成寄存器变量,用来提高访问速度
五种变量的存储方式:
语言链接性:
全局自动变量 加 static 链接性为内部的静态持续变量 不加,链接性为外部。
局部变量加static会变成静态持续变量,代码块结束时不会消失,下次再进入代码块时,仍然存在。
#include<iostream>
class Master{
public:
void test(){
static int ter = 0;
for(int i = 0; i <= 10; ++i)
{
ter += 1;
if(ter % 5 == 0)std::cout << ter<< std::endl;
}
}
void solve(){
for(int i = 0; i <= 10; ++i){
test();
}
}
};
int main()
{
Master master = Master();
master.solve();
return 0;
}
常规的外部变量具有外部链接性
const 和 volatile 被称为cv修饰符
const 修饰的全部变量的链接性是内部的,其他文件使用时,需使用external关键字声明
当前文件链接性为外部的变量不能和引入的外部变量相同(单独定义规则) 如果当前文件的全局变量是静态变量,则当前文件的静态变量会隐藏引入的外部变量
volatile: 编译器优化相关,如果程序中有两个地方同时使用了一个变量,那么编译器会将这个值放入寄存器中, 然而在这两个使用之间,这个变量的值可能改变(可能来自硬件),因此使用volatile表明让编译器不要做这个优化
mutable:在一个类实例加上const时,如果他的某个成员被mutable修饰,那么这个成员仍然可以改变。
使用匿名空间替代内部静态变量
匿名空间只可在当前文件使用,与链接性为内部的全局变量效果相同。
命名空间嵌套
命名空间可以嵌套,使用域名解析符(::)可以表示嵌套关系,内联命名空间可以在除最外层命名空间的任意一层使用。
using 编译和 using 声明
不建议使用using 编译,因为这样不知道你使用那些东西,建议使用using声明,或者直接使用命名空间名::空间内的函数或变量的方式。
stdio.h 和cstdio的区别
cstdio表明将stdio这个文件集成到了std命名空间内。