c++学习笔记之内存模型和名称空间
内容包括:
1.单独编译
2.存储持续性、作用域和链接性
3.定位new运算符
4.名称空间
1.单独编译
C++语言的优势之一就是其高效性,其高效性表现之一就是将代码的执行分成不同文件来执行,类似于SDN中的管理层,数据层分离,C++语言将语句分层(分文件)执行:
- 头文件:包括结构声明(结构原型)、使用这些结构的函数的原型;
- 源代码文件1:包含与结构相关函数(主函数);
- 源代码文件2:使用这些结构的函数的源代码;
一个源文件引用另一个源文件中变量,即外部变量时,需要加关键字extern,进行引用。引用不会给外部变量进行额外的赋值寻址,只是进行外部调用
2.存储的持续性、作用域和链接性
1.自动存储持续性
主要体现者是:函数相关参数的存储;
存储时间:程序运行开始到程序结束;
作用域:取决于定义位置;
2.静态存储持续性
主要体现者是:外定义函数参数(变量)和static定义的变量;
存储时间:在程序运行中一直存在;
作用域:取决于定义位置;
链接性:外链(外定义函数参数(变量))、内链(使用static的外定义函数参数(变量))和无链(static内部变量,另外使用static关键字也能避免变量名称冲突,另外const具有将变量声明成内链静态变量的作用)
所有的静态持续变量没有初始化的时候,所有位被设为0
3.线程存储持续性
主要体现者是:thread_local定义的变量;
存储时间:线程存在的时间;
4.动态存储持续性(这种动态存储有时被称为堆heap或者自由存储free store)
主要体现者:new定义的变量;
存储时间:出现delete该变量;
作用域和链接性的不同:作用域指的是该变量对外部的作用范围;链接性指的是外部对该变量的关联程度
3.定位new运算符
由于不受于作用域和链接性的控制,new函数和delete函数一头一尾对动态变量进行存储和释放
1.使用new进行初始化
初始化可以看做赋值,变量的产生,对不同的变量使用的语法规则类似:
变量类型 | 初始化语法举例 |
---|---|
标量 | int *pi = new int(6) |
结构 | struct_name *pi = new struct_name{struct_1, struct_1,… } |
列表 | int *pin=new int{1,2,3} |
数组 | int *pin = new int[2]{1,2} |
2.new的替换函数
在使用new进行初始化和分配函数时,通常是被转化成相应的替换函数进行处理的。
3.new作为定位符
需要在文件中包含头文件new,并且通过()来进行定位操作;
#include <new>
struct big
{
char dog [10];
int pig [10];
};
char dingding[100];
char bingbing[500];
int main()
{
big *p1,*p2;
int *p3,*p4;
p1 = new big;
p3 = new int [20];
p2 = new (dingding) big; //定位符作用,在dingding中寻找一个地址给big结构
p4 = new (bingbing) int[20];
}
delete只能释放常规new的内存,无法释放new作为定位符进行存储的内存
3.名称空间
3.1名称空间的作用
名称空间的作用是避免调用重名函数或变量导致出错,在某程序运行的时候会调用某函数,由于该函数在可能拥有多个重名且同类型参数的函数(并不是重载函数)或变量,导致运行出错。
3.2名称空间的创立语法
使用namespace创建
3.3名称空间元素(函数或变量)调用
使用作用域解析运算符(::)对其进行访问;
3.4声明和编译指令的使用
在不需要初始化的使用某空间中的元素时,使用using来对特定的标识符进行可用标示
1.using namespace_name :: _name //对某空间的某变量或函数进行声明;
2.using namespace namespace_name //对某名称空间进行声明,使其空间内所有元素在所声明的作用域内可用;
3.5嵌套名称空间及其访问
namespce_name_1::namespce_name_2:元素名称;
3.6名称空间创建别名
namespace mvp = mv_p; //mv_p为一个名称空间,其别名是mvp