C++内存管理
内存分配方式
地址从低到高依次为:
- 代码区:存放程序运行的代码段
- 静态存储区:存放静态变量以及初始化后的全局变量
- bss段:存储未进行初始化的全局变量和静态变量
- 堆:使用malloc分配的内存
- 文件映射区:进程间共享文件使用的内存区
- 栈:存储局部变量,函数参数以及返回值等,执行完后会释放
堆和栈的区别
- 管理方式:栈由编译器管理,堆内存的申请和释放由程序员通过malloc和free来实现。
- 空间大小:堆可分配空间比栈要大。堆在系统中可分配几个G的内存,栈只有几M。
- 碎片问题:堆在不断地malloc和free中,内存逐渐被碎片化;栈后进先出,不会出现碎片。
- 增长方向:堆的增长方向是向着地址增大的方向进行,栈是向着地址减小的方向增长。
- 分配方式:堆只能动态分配;栈可以静态分配也可以动态分配。堆的分配由malloc实现,需要手动使用free释放;栈的动态分配由alloca()实现,由编译器自动释放,可用于局部变量的动态分配。
- 分配效率:栈的分配由编译器和操作系统底层实现,效率较高;堆的分配涉及上层程序,效率较低。
静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候