【c++内存系列】二、c++动态内存分配和静态内存分配

一、内存的静态分配与动态分配方式

先简单理解静态分配与动态分配:

静态内存分配和动态内存分配比较典型的例子就是数组和链表,数组的长度是预先定义好的,在整个程序中是固定不变的,所以他在内存分配时是以静态内存分配的方式进行的。而链表,它的信息有可能会随时更改,内存的分配取决于我们实际输入的数据,这样就用到了动态内存分配的方式。
静态内存分配是在程序编译或者运行过程中,按事先规定的大小分配内存空间的分配方式,他的前提的必须事先知道所需内存空间的大小,动态内存分配是按输入信息的大小分配所需要的内存单元,他的特点是按需分配。即,静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。

 

内存的静态分配和动态分配的区别主要是两个:

      1. 时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。

      2. 空间不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数_alloca进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。    

 

二、进程的静态存储空间与动态存储空间

对于一个进程的内存空间而言,可以在逻辑上将存储空间的分为三种情况:
程序区:存放程序语句

静态存储区:全局变量,局部静态变量

存放全局变量,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。

动态存储区:函数形参变量(在调用函数时给形参分配存储空间),局部动态变量(auto register),函数调用现场保护和返回地址等。

-----------------------------------------------------------------------------------------------------------------

动态存储方式
所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。
动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 
典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。

动态存储区:
1.栈和堆

栈:会存放函数的返回地址、参数和局部变量。

堆:我们通过 new 算符和 malloc 函数分配得到的空间。

堆和栈在内存中分配位置,跟硬件架构和操作系统都有关系。
x86中栈都是由高地址向低地址分配,堆是由低地址向高地址分配,不过在 Windows 和 Linux 中堆和栈的位置相反,另外存放静态数据、代码的区域位置也有一些不同。
栈是属于线程的,每一个线程会有一个自己的栈。
2.局部自动变量
存放在栈区,在栈区里面其实又可以分成好几个区域,他们叫做栈桢,一个栈桢就是一个函数,需要调用该函数的时候就如入栈,函数return的时候就会弹出栈,所以他们的生命周期是从函数的开始直到函数结束。
而栈帧里面又存放着什么呢,栈帧存放着以下几种东西:参数变量的地址,局部变量的地址,return的地址(还有栈指针和基指针,想知道这个是就什么百度吧)
3.自动变量(未加static声明的局部变量) ;
4.函数调用时的现场保护和返回地址等;
5.动态变量

通常是由malloc new等分配的空间,生命周期是从分配的那一刻直到free结束。
-----------------------------------------------------------------------------------------------------------------


静态存储方式
所谓静态存储方式是指在程序编译期间分配固定的存储空间的方式。
该存储方式通常是在变量定义时就分定存储单元并一直保持不变, 

直至整个程序结束。全局变量,静态变量等就属于此类存储方式。  

静态存储区:
一定会存在的而且会永恒存在、不会消失,这样的数据包括常量、常变量(const 变量)、静态变量、全局变量等。
静态 、常量、全局变量就是存放在静态存储区,他们在程序编译完成后就已经分配好了,生命周期持续至程序结束。
-----------------------------------------------------------------------------------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章