C/C++中的内存四区

C/C++中的内存四区

C++程序在执行时,将内存大方向划分为4个区域:

代码区:存放函数体的二进制代码,由操作系统进行管理的。
全局区:存放全局变量、静态变量以及常量。
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

内存四区的意义:不同区域存放的数据,赋予不同的生命周期,使我们的编程更大的灵活性。


在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

一. 代码区

存放 CPU 执行的机器指令存放可执行文件的二进制代码。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。

总结:你所写的所有代码都会放入到代码区中,代码区的特点是共享和只读。

二. 全局区

全局区中主要存放的数据有:全局变量、静态变量、常量(如字符串常量)

全局区的叫法有很多:全局区、静态区、数据区、全局静态区、静态全局区

这部分可以细分为data区和bss区

2.1 data区

data区里主要存放的是已经初始化的全局变量、静态变量和常量

2.2 bss区

bss区主要存放的是未初始化的全局变量、静态变量,这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL

2.3 常量区

常量区是全局区中划分的一个小区域,里面存放的是常量,如const修饰的全局变量、字符串常量

总结:全局区存放的是全局变量、静态变量(包括静态局部变量)和常量,该区域的数据在程序结束后由操作系统释放。


在程序运行后产生了两个区域,栈区和堆区

三. 栈区

栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量(包括const修饰的局部变量)等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。

注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

四. 堆区

堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

你可能感兴趣的:(C/C++,c++,c语言)