C和C++的内存模式有一定的区别,先分别整理总结(大部分摘自C++ primer 300+)
C++内存根据存储方面提供多种选择,如根据保留在内存中的时间长度(存储持续性),或者根据访问数据的权限等(作用域和链接)
另外new也可以动态分贝内存,定位new运算符提供了这种技术的一种变种(后半句什么意思||在选定的空间分配内存)
C++的名称空间也是一种控制访问权的方式
1.存储持续性
(1)自动存储类型:
生命周期为所在函数或者代码块。C++有2中存储持续性为自动的变量
(2)静态存储类型:
生命周期为整个程序运行过程。C++有3中存储持续性为静态的变量
(3)线程存储类型:
生命周期同所属的线程,用thread_local关键字声明
(4)动态存储类型:
用new 运算符分配内存一直存在,直到程序结束或者delete运算符将其释放。这种内存的存储持续性为动态,有事被称为自由存储或者堆(heap)
2.作用域
描述名称在文件(翻译单元)的多大范围内可见,一般分局部和文件
3.链接性
描述名称在不同单元间的共享的方式
自动变量无连接性
静态存储类型有三种连接性:
无:只能在当前函数或者代码块中访问
内部:只能在当前文件访问
外部:可以在其它文件中访问
5中变量的存储方式
存储描述 持续性 作用域 连接性 声明方式
自动 自动 代码块 无 在代码块中
寄存器 自动 代码块 无 在代码块中,使用关键字register
静态(无链接性) 静态代码块无在代码块中,试用关键字static
静态(外部链接性) 静态 文件外部不在任何函数中
静态(内部链接性) 静态 文件内部不在任何函数中,试用关键字static
当链接性为外部,当其他文件中要使用时,需要使用extern关键字来声明。
使用C++运算符new(或者C函数 malloc())分配的内存被称为动态内存,动态内存由new和delete控制,而不是由作用域和链接性规则控制。
因此可以在一个函数中分配动态内存,在另外一个函数中进行释放。
与自动内存不同,动态内存不是LIFO(Last In First Out?),其分配和释放顺序取决于new和delete在何时以何种方式被使用。
通常,编译器使用三块独立内存
1.用于静态变量(可以再细分)
2.用于自动变量
3.用于动态存储
虽然存储方案概念不适用于动态内存,但适用于用来跟踪动态内存的自动和静态指针变量。