内存四区
一个c/c++程序所占用的系统内存共分为4个部分
1、栈区(也叫堆栈,stack):存放所有的局部变量,函数形参,由系统进行自动完成。栈的大小:在Linux中为8兆, 在windows中为2兆。
2、堆区(heap):由程序员自己管理的,在程序运行过程中进行动态分配的内存。你可以用malloc()系列函数进行动态的添加和释放。堆的大小并不是固定的,可以动态的扩张或者收缩。
3、数据区:数据区中分两个部分
第一部分—未初始化的数据段(bss):存放全局和静态(全局静态、局部静态)的未初始化的变量
第二部分—数据段(data) :存放程序中明确被初始化的全局变量和静态变量(包括全局静态变量和局部静态变量)
4、代码段(text):存放所有可执行代码(包括程序指令、常量字符串等)都加载到代码区。这块内存在程序运行期间不变。
栈和堆的区别
以下从6个方面来比较两者
1、增长方向:栈:从上往下
堆:从下往上
2、管理方式:栈:编译器自动管理,无需程序员控制
堆:堆空间的申请和释放工作由程序员控制,但容易出现内存泄漏。
3、是否产生碎片:栈由系统操作控制不产生碎片
堆:由于频繁的malloc/free,造成内存空间的不连续,造成大量的碎片空间,程序效率低。
4、分配方式:栈:由编译器完成分配释放,栈的动态分配由alloca()函数完成,由编译器申请和释放。
堆:利用malloc()系列函数动态申请分配,由free()函数释放。
5、空间大小: 栈:很小。
堆:比栈要大的多。
6、分配效率:栈:很高:计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址。压栈、出栈都有专门的指令执行。
堆:比栈低的多:为了分配一块内存,库函数会按算法在堆内搜索可用的足够大的空间,没有的情况下需要操作系统来重新整理内存空间。