(1)C语言编程中的内存基本构成
C的内存基本上分为4部分:静态存储区、堆区、栈区以及常量区。他们的功能不同,对他们使用方式也就不同。
1.栈 ——由编译器自动分配释放;
2.堆 ——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;
3.全局区(静态区)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(C++中已经不再这样划分),程序结束释放;
4.另外还有一个专门放常量的地方,程序结束释放;
(a)函数体中定义的变量通常是在栈上;
(b)用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上;
(c)在所有函数体外定义的是全局量;
(d)加了static修饰符后不管在哪里都存放在全局区(静态区);
(e)在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用;
(f)在函数体内定义的static表示只在该函数体内有效;
(g)另外,函数中的"adgfdf"这样的字符串存放在常量区。
(2)C++编程中的内存基本构造
在C++中内存分成5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区;
1、栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区,里面的变量通常是局部变量、函数参数等。
2、堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3、全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
4、常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)。
5、代码区 (.text段),存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。
内存模型组成部分:自由存储区,动态区、静态区;
根据c/c++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即:自由存储区,动态区、静态区。
自由存储区:局部非静态变量的存储区域,即平常所说的栈;
动态区:用new ,malloc分配的内存,即平常所说的堆;
静态区:全局变量,静态变量,字符串常量存在的位置;
注:代码虽然占内存,但不属于c/c++内存模型的一部分;
一个正在运行着的C编译程序占用的内存分为5个部分:代码区、初始化数据区、未初始化数据区、堆区 和栈区;
(1)代码区(text segment):代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。注意:代码区的指令中包括操作码和要操作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;
(2)全局初始化数据区/静态数据区(Data Segment):只初始化一次。
(3)未初始化数据区(BSS):在运行时改变其值。
(4)栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。
(5)堆区(heap):用于动态内存分配。
为什么分成这么多个区域?
主要基于以下考虑:
#代码是根据流程依次执行的,一般只需要访问一次,而数据一般都需要访问多次,因此单独开辟空间以方便访问和节约空间。
#未初始化数据区在运行时放入栈区中,生命周期短。
#全局数据和静态数据有可能在整个程序执行过程中都需要访问,因此单独存储管理。
#堆区由用户自由分配,以便管理。