常见的内存分配方式
静态存储区(基栈):此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。里面的变量通常为:static变量、全局变量const常量;
浮动栈(栈):相关代码执行时创建,执行结束时被自动释放。随函数、对象的执行而分配。。由系统自动分配、回收内存。
内存分配:高地址->低地址;释放顺序:先进先出。
里面的变量通常为:局部变量、函数参数等。
堆:动态分配内存。用new/malloc时开辟,delete/free时释放。堆可以动态地扩展和收缩。内存的释放由应用程序控制,易出现内存泄露等问题。
另一种分类方式:
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈:由编译器在需要的时候分配,不需要的时候自动清除的变量的存储区。里面通常存:局部变量、函数参数等;
堆:由new分配的内存块;
自由存储区:由malloc分配的内存块;
全局/静态存储区:存全局变量、静态变量;
常量存储区:里面存放常量;
堆与栈示例
以下示例能帮助你区分堆与栈。
void f() { int* p=new int[5]; }
分析:上述代码包含了堆与栈。new在堆上分配了一块内存;指针p则分配了一块栈内存。故该代码的含义是:在栈内存中存放了一个指向一块堆内存的指针p。
堆与栈的区别
1.空间大小不同:堆的大小受系统虚拟内存空间限制,栈则较小。一般来讲,在32位系统下,堆内存可达4G空间;在VC6下面,默认的栈空间大小是1M( 这个数据是别人提供的参考数据);
2.管理方式不同:堆 需要程序员控制,生命周期不受函数作用域限制;栈 编译器自动管理,生命周期与函数作用域一致;
3.分配方式不同:堆 都是动态分配,没有静态分配的堆;栈 有静态分配和动态分配,静态分配是由编译器完成的,比如局部变量的分配;动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
4.分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
5.能否产生碎片不同:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
6.生长方向不同:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。(?)
虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)