C++的内存分布与管理
- 栈区
- 堆区
- 全局区
- 代码区
- 常量区
栈区
(1)什么是栈区?
栈区(Stack) 是用于存储函数调用,局部变量和函数参数的一种内存区域,它的特性就是先进后出(FILO)。
(2)栈区作用:
- 管理程序函数的调用和返回;
每当函数被调用时,其参数、局部变量和函数调用上下文(例如函数返回地址等)会被压入栈中。函数执行完毕后,这些数据会被从栈中弹出,控制流返回到调用者处。
- 局部变量存储
函数中声明的局部变量(即在函数内部定义的变量)通常存储在栈上。这些变量的生命周期与函数的调用周期相对应,当函数返回时,它们会自动被销毁。
- 函数参数的传递
函数的参数也被存储在栈上。当函数被调用时,参数会被压入栈中,并在函数内部使用。在函数返回时,参数会从栈中弹出。
- 函数调用的上下文保存
每次函数调用时,函数的调用上下文(例如函数返回地址、上一个函数的栈帧等)会被保存在栈上,以便在函数返回时恢复执行状态。
(3)注意
栈区大小在程序启动时就已经固定,并且在栈上分配的内存大小是静态的【系统栈大小限制】,因此不适合存储大量的数据或动态分配内存
堆区
(1)什么是堆区?
堆区(Heap),也称为自由存储区(Free Store),是程序运行时动态分配内存的一种区域。堆区的大小通常比栈大,并且在程序运行时可以动态增长或缩小。堆区的内存手动申请和释放,而不像栈区那样由编译器自动管理。
(2)堆区的作用与特点:
- 动态内存分配
堆区允许程序在运行时动态地分配内存,以满足程序的实际需求。这种动态内存分配是通过运行时的内存管理函数(例如 new、delete 或 malloc、free)来实现的。
- 变量的生命周期不受限制
在堆区上分配的内存不会在函数返回时被释放,而是会一直存在直到显式释放或程序结束。因此,堆区上分配的内存可以跨越函数调用和程序的不同部分使用。
- 灵活性强
堆区的大小可以根据程序的需要动态调整,因此适合存储大小不确定或需要动态分配的数据结构,例如动态数组、链表等。
- 手动管理
堆区的内存由程序员手动申请和释放,因此需要注意避免内存泄漏和内存溢出的问题。程序员需要负责在不再需要某块内存时及时释放它,否则可能导致内存泄漏。
- 非连续存储
堆区的内存分配是不连续的,内存块的分配和释放可能会导致堆内存中出现碎片化。
(3)注意:
堆区的手动管理内存可能会导致内存泄漏等问题,需要注意手动释放内存
全局区
(1)什么是全局区?
全局区(Global Area)是程序中用于存储全局变量和静态变量的一块内存区域。全局区在程序启动时就会被分配,而且在程序的整个运行周期内都存在,直到程序结束。
(2)全局区的作用与特点:
- 存储全局变量和静态变量
在全局区中,存储了程序中所有的全局变量和静态变量。全局变量是在函数外部定义的变量,它们在整个程序中都是可见和可访问的;静态变量是用 static 关键字声明的局部变量或全局变量,它们的生命周期延长到程序的整个运行周期。
- 在程序启动时分配
全局区的内存空间在程序启动时就会被分配,并且在程序运行期间一直存在,直到程序结束。因此,全局变量和静态变量的内存分配是静态的。
- 固定大小
全局区的大小是固定的,并且在编译时就已经确定。全局区的大小由编译器根据程序中定义的全局变量和静态变量的数量和大小来确定。
- 存储位置
全局区通常位于程序的数据段(Data Segment)或者是已初始化数据段(Initialized Data Segment)中。全局变量和静态变量的存储位置是由编译器决定的。
- 全局可见
全局变量和静态变量在整个程序中都是可见和可访问的,因此它们可以被程序的任何地方使用。
代码区
(1)什么是代码区?
代码区(Code Area),也称为文本区(Text Area)或者只读区域(Read-Only Area),是存储程序执行代码的一块内存区域。代码区在程序加载到内存时就已经被分配,并且通常具有只读权限,不允许对其进行写操作。
(2)主要作用与特点:
- 存储程序指令
代码区存储着程序的机器指令,包括函数体中的代码、条件语句、循环语句等等。这些指令在程序执行时被CPU依次执行,实现程序的功能。
- 只读权限
代码区通常具有只读权限,不允许对其进行写操作。这是为了保护程序的执行代码不被意外修改,以确保程序的正确性和安全性。
- 静态分配
代码区的内存空间在程序加载到内存时就已经被静态分配,且在程序的整个执行过程中都存在。因此,代码区的大小在程序运行期间是固定的,不会动态增长或缩小。
- 存储位置
代码区通常位于程序的只读内存区域,例如在可执行文件(.exe)或共享库文件(.dll)中。程序被加载到内存时,操作系统会将代码区的内容加载到内存中。
- 执行代码
程序的执行是通过从代码区加载指令并执行这些指令来实现的。CPU会按照代码区中的指令顺序执行程序,从而完成程序的各项功能。
常量区
(1)什么是常量区?
常量区(Constant Area),也称为只读数据区(Read-Only Data Area)或者数据段(Data Segment),是存储程序中常量数据的一块内存区域。常量区在程序加载到内存时就会被分配,并且通常具有只读权限,不允许对其进行写操作。
(2)作用和特点:
- 存储常量数据
常量区用于存储程序中的常量数据,包括字符串常量、全局常量和静态常量等。这些常量数据在程序运行期间保持不变,因此存储在常量区。
- 只读权限
常量区通常具有只读权限,不允许对其进行写操作。这是为了保护程序中的常量数据不被修改,确保程序的正确性和安全性。
- 静态分配
常量区的内存空间在程序加载到内存时就已经被静态分配,且在程序的整个执行过程中都存在。因此,常量区的大小在程序运行期间是固定的,不会动态增长或缩小。
- 存储位置
常量区通常位于程序的只读内存区域,例如在可执行文件(.exe)或共享库文件(.dll)中。程序被加载到内存时,操作系统会将常量区的内容加载到内存中。
- 常量数据类型
常量区中的数据类型包括字符串、整数、浮点数等,这些数据在程序运行期间保持不变,因此存储在常量区。