C++中存储区分类
- 一般来讲C++的存储区分为三大块
- 静态存储区(static storage duration):静态变量被分配在此区段,全局变量隐含的是静态的。变量的分配是编译和链接时完成的,但是初始化直到程序中的定义语句处才进行,如果定义时没有提供初始化表达式,则使用默认值初始化。直到程序结束之前,变量不会被销毁。
- 自动存储空间(automatic storage duration):非静态局部变量分配在程序的栈(stack)中,他们程序执行到作用域(scope)的开始处分配空间并且初始化(如果有的话),在离开作用域之前被销毁。因此,变量的创建和销毁是自动完成的,又叫做自动(automatic)变量,你可以在自动变量前使用auto关键字,但是不会产生额外的效果。
- 自由存储区(dynamic storage duration):使用new创建的变量分配在自由存储区(free store),变量的创建和销毁由程序完全的控制,一般使用运行环境(操作系统)提供的功能调用接口完成。
- 同时也存在另一种观点,认为还有两种类型:
- 常量区:字面常量存放在该区域,更改此区域的内容的行为其结果不可预期。然而,概念上,字面常量的区域和静态存储区的特点是类似的,附加的只读保护功能是实现相关的,例如8086实模式下没有数据段的只读保护功能,因此该模式下的程序不可能严格区分常量区和静态存储区。
- 堆:实在难以理解堆(heap)和自由存储区(free store)的区别,仔细阅读持这种意见的文章,似乎唯一说得通是heap是malloc/free使用的,而free store是new/delete使用的,由于C++标准并没有规定new/delete一定用malloc/free实现,因而从这个角度上来看,堆和自由存储区物理上可能是不相同的。然而,从行为特征上来看,二者并没有本质的区别,仅仅是因为实现的差异而已。
String, Value, Reference在内存中的存储方式
- 字符串在内存中的存储方式
- 内存中所有字符型数据都以ASCII码存储
- 字符串的存储机制都以数组形式排列,根据字符串长度,配置0--N+1的空间,读取时,内存中的字符串通过数组下标来获取字符
- 字符串在编译时就放在常量区了,比如char *c1 = "hello"; char *c2 = "hello";其实C1和C2指向同一个地方,上面这种情况好像有一种说法叫做浅复制。一般来讲,在编译时遇到一个字符串常量时,首先会在常量区查找这个字符串在常量去是否存在了,如果没有才将这个字符串常量放入常量区。
- 引用在内存中的存储方式
- 申明一个引用的时候,切记要对其进行初始化,不能建立数组的引用
- int (&b)[3]表示b是一个指向三个元素数组的引用,在C++中是合法的
- int& b[3];表示定义或者声明一个引用数组,也就是b中的3个元素都是引用;这在c++中是不允许的
- 引用不能够作为数组中的元素,主要原因是引用不支持传统意义的复制,在定义一个引用的时候,标准是说不会为其分配内存,但从汇编情况看,应该是为他分配了内存的,只是C++编译器对这种情况进行了特殊处理
- 值在内存的存储方式
- value中则主要就是放在栈里面,在程序运行时创建