内存的分配方式
内存的分配方式
程序多占的系统内存一般分为以下几个(C++):
全局/静态存储区:存放全局变量和静态变量。包括全局变量,静态全局变量,静态局部变量。初始化的全局变量和静态变量放在一块区域,未初始化的放在相邻的另一块区域。程序结束后由系统释放。
栈区:存放程序临时创建的局部变量、参数值等,是一块连续的区域,由编译器在自动分配释放。栈类似数据结构,也是先进先出。栈的指令使用寄存器存储,效率高,但是容量有限,栈的空间:windows下为2M,linux下为8M。
栈存放的一般包括函数括弧“{}”中定义的变量,但是不包括static声明的静态变量。除此之外还包括,在函数被调用时,其参数也会被压入发起调用的进程栈,调用结束后,函数的返回值也会存放在栈中。
常说的堆栈是栈。
堆区:运行中动态分配的内存段,进程调用new/malloc等函数分配内存,新分配的内存动态的添加到堆上,是不连续的区域,分配方式类似于链表。由程序员通过free/delete释放。堆的空间一般小于2GB。
常量区:存放常量及const定义的常量,不允许修改。
当函数发生调用时:
1.把参数压入栈。第一个进栈的主函数中的下一条指令,然后是各个参数,大多数参数是从右向左入栈,然后是局部变量。
2.保存指令寄存器(IP)中的内容,作为返回地址。
3.基址寄存器(FP)入栈
4.当前的栈指针(SP)拷贝到FP,作为新的基址。
5.为本地变量留出一块空间,把SP减去适当的值。
调用结束后,局部变量先出栈,然后是参数,最后是栈顶指向最开始的地址—也就是主函数中的下一条指令,程序由该点继续运行。
堆和栈的区别:
1.管理方式:
栈是自动分配,由编译器管理。堆是程序员通过new/malloc分配,通过new/delete释放。
2.空间大小:
栈的空间:windows下为2MB,linux下为8MB。堆的空间一般是2GB。
3.生长方向:
堆的生长方向向高地址扩展(记忆:堆起来),栈的方向向低地址扩展。
4.分配方式:
栈由静态分配和动态分配。堆只有动态分配。
5.碎片问题:
对于栈不会有这个问题。而堆频繁的new/delete会造成内存空间不连续,从而造成大量碎片,使效率降低。
6.分配效率:
栈是由寄存器存放,效率较高。堆是由库函数提供,在分配一块内存时,库函数首先按照一定的算法在堆内存机制中搜索可用的足够大小的空间,如果没有,可能调用系统功能去增加程序数据段的内存空间,这样就有机会获得足够的空间,然后返回。
堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历改链表,寻找到第一个大于所申请空间的堆节点,然后将该节点从空闲链表中删除,将该节点分配给程序,所以效率较低。
posted on 2016-09-30 16:05 zhuzhu2016 阅读(360) 评论(0) 编辑 收藏 举报