首先,当一个C/C++编译的程序占用内存分为:栈(stack),堆(heap),全局区(静态区static),文字常量区以及程序代码区。
堆:由程序员分配,若程序员在分配空间,到程序结束后没有释放则可能被操作系统(OS)回收
栈:由系统自动分配以及释放,用来存放函数的参数值,局部变量的值。
接着,聊一聊申请后系统的响应
堆:操作系统有一个记录空闲地址的链表,当系统受到程序的申请时,会遍历该列表,找到第一个空间大于所申请空间的堆结点,在链表中删除这个结点,并将这个空间分配给程序
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存空间,否则报异常,显示为栈溢出。
最后聊一聊分配效率问题以及优缺点
堆:由程序员分配,速度慢,容易产生内存碎片(由于遍历出的空间地址往往会大于申请的空间,所以多余空间将会重新放入空闲空间链表之中),但优点则是分配起来最方便。
栈:系统自动分配,速度很快,但不受程序员控制。