内存区分配(栈区堆区全局区)C++

1栈区(stack)

1)临时数据寄存交换区,存放局部变量和对象;
2)先进后出,向低地址生长。
3)空间大小1~2MB,超出会出现内存溢出错误,适用于占用空间定长且占用空间小的数据。不太适用于递归函数(a.函数没递归一次都会生成一个对象,每返回一次都会销毁一个对象,所以随递归调用深度增加,需要栈空间也会线性增加,可能造成栈溢出b.每个对象都局限于当前调用层,对于不管是对于更浅露的外层还是更深入的内层都是不可见的,因而每层都需要自己的局部对象和共享。因而此时使用静态(static)局部函数,不仅可以大大减小函数开销,还可以保存函数被调用时的中间态,被各层所访问)。
4)栈区内存配置和释放由编译器决定。
5)特点:a.自动生成自动销毁
b.空间小,速度快

int fun(int y){}
int mian(){
t=fun(x);
return 0;
}
//过程:
// 1 fun函数为值传递,因而x会调用赋值构造函数,产生一个临时对象,也就是y。
// 2 在函数返回时,y需要调用赋值构造函数,产生一个新的临时对象y1,同时栈对象y被释放。
// 3 y1调用赋值构造函数,产生新临时对象t,y1被释放。
// 4 t,x则在main函数返回后被释放。

//可以看到值传递过程中,编译器产生了较多临时对象以及需要进行相应的内存空间内配与释放,开销较大。
//因而在面对较大的对象的函数传参时以及返回时尽可能采用const引用传递与返回,避免内存反复申请与释放。

2堆区(heap)

1)动态分配内存区;大小不固定。
2)适用于内存数据长度不固定,内存占用较大的数据,如字符串,数组。
3)先进先出,满足堆性质的一种优先队列;向高地址生长。
4)堆区的内存配置和释放有程序员决定 。
5)特点:动态性;容量大。

 T*p=(T*)malloc(sizeof(T));
 T*p=new T();
 /*采用new时,需要delet释放内存以及p置为NULL。malloc则对应free
 1)不释放内存会造成内存泄漏;
 2)指针不置空会使p成为野指针,后续不当使用p将会造成程序奔溃。
 */

3全局区(静态static存储区 )

1)存储静态或全局对象。
2)特点
a,全局对象为类以及函数间通信提供了一种简单直接的方式。(但过多的使用全局对象会降低程序的健壮性,稳定性,可维护性以及可复用性)。
b静态局部变量可以代替栈对象保持递归函数被屡次调用时的中间态,减少函数是调用开销以及各层能共享访问。

int main(){
_main();//隐式代码,由编译器生成,构造静态或全局对象
...//显示代码
return 0;
}
/*在正式执行main函数的显示代码前,编译器会先自动生成一个_main()函数,
来构造和初始化所有静态全局或全局对象。
注1):静态局部变量在其所在函数贴被执行时,第一次分配内存与初始化,之后该静态局部变量不再执行初始化语句并一直存在到程序结束。
注2):类的静态局部变量伴随着该类的第一个实例化对象的产生而产生,之后被该类或继承自该类的所有对象所共享直到程序结束。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页