C++内存管理和命名空间

122 阅读3分钟

数据保留在内存中的时间长度被称为存储持续性

数据的作用域和链接性

  • 作用域:数据可以被代码块引用的范围,能够引用某数据的代码块都是此数据的作用域
  • 链接性:内部链接为当前文件可访问此数据,外部链接为:当前文件可访问,同时其他文件也可以访问。

c++名称空间:控制访问权限,与Java的包功能相同,用于多人协作。

C++的内存模型和名称空间

  1. 自动存储持续性:随定义位置的代码块生灭
  2. 静态存储持续性:随整个程序生灭 三种 : static 全局变量 块内static
  3. 线程存储持续性:随线程的创建与销毁生灭 用thread_local声明
  4. 动态存储持续性:随关键字 new 生 随关键字 delete 灭

自动变量使用栈实现

register :使被修饰的变量变成寄存器变量,用来提高访问速度

五种变量的存储方式:

image.png

语言链接性:

image.png

全局自动变量 加 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命名空间内。