在 C 和 C++程序编译过程中,内存分配主要涉及以下几个区域:
一、栈(Stack)
存储内容:
- 局部变量:函数内部定义的非静态变量。
- 函数参数:传递给函数的参数。
- 函数调用信息:包括返回地址、调用者的栈帧指针等。
特点:
- 先进后出(Last In First Out,LIFO)的数据结构。
- 内存由编译器自动管理,函数调用时分配空间,函数返回时自动释放。
- 空间大小相对较小,通常在几兆字节到几十兆字节之间。
二、堆(Heap)
存储内容:
- 动态分配的内存:通过 C 中的
malloc
、calloc
、realloc
和 C++中的new
运算符分配的内存。 - 大型数据结构:例如大型数组、复杂的结构体等,当在栈上分配可能导致栈溢出时,通常在堆上分配。
- 动态分配的内存:通过 C 中的
特点:
- 内存的分配和释放由程序员手动控制。
- 空间大小相对较大,可以根据程序的需要动态扩展(取决于系统内存资源)。
- 分配和释放操作相对较慢,因为需要操作系统的参与。
三、全局/静态存储区(Global/Static Memory Area)
存储内容:
- 全局变量:在函数外部定义的变量。
- 静态变量:包括静态局部变量和静态全局变量。
特点:
- 在程序开始运行时分配内存,在程序结束时释放。
- 全局变量和静态全局变量在整个程序的生命周期内都存在,并且可以被多个文件访问(静态全局变量的作用域仅限于定义它的文件)。
- 静态局部变量在函数调用之间保持其值,但作用域仅限于定义它的函数。
四、常量存储区(Constant Memory Area)
存储内容:
- 常量:例如字符串常量、数值常量等。
- 全局常量和静态常量也存储在这里。
特点:
- 内存中的内容在程序运行期间不能被修改。
- 通常存储在只读存储器(ROM)中,以提高安全性和性能。
五、代码区(Code Area)
存储内容:
- 程序的机器代码:即编译后的函数和指令。
特点:
- 通常是只读的,以防止程序的代码被意外修改。
- 存储程序执行的指令序列,由 CPU 读取并执行。