在C++中,内存分成5个区,由高地址到低地址依次是:
-
栈:栈的内存地址是连续的且被一一记录的。内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。(为运行函数而分配的局部变量(包括局部const)、函数参数、返回地址等存放在栈区)。栈运算分配内置于处理器的指令集中,效率很高,但是分配的内存容量有限。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
-
堆:堆里面申请的东西,是随机分配的。使用malloc进行分配,使用free释放。如果未能对内存进行正确的释放,会造成内存泄漏。但在程序结束时,会由操作系统自动回收。所以申请了堆空间之后一定要创建一个指针保存你说申请到的堆空间的地址。不然就找不到你申请的空间了。
-
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,C语言中区分初始化和未初始化的,C++中不再区分了。(全局变量、静态数据、常量存放在全局数据区)
-
常量存储区:存储常量,不允许被修改。
-
自由存储区:使用new进行分配,使用delete进行回收。和堆类似。
C++内存区域中堆和栈的区别:
管理方式不同:
- 栈是由编译器自动管理,无需我们手工控制;
- 对于堆来说,释放由程序员完成,容易产生内存泄漏。
能否产生碎片:
- 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
- 对于栈来讲,则不会存在这个问题。
生长方向不同:
- 对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;
- 对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。
分配方式不同:
- 堆都是动态分配的;
- 栈有静态和动态两种分配方式。静态分配由编译器完成,比如局部变量的分配。动态分配由alloca函数进行、但栈的动态分配和堆是不同的,它的动态分配由编译器进行释放,无需我们手工实现。
分配效率不同:
- 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
- 堆则是c/c++库函数提供的,机制很复杂。库函数会按照一定的算法进行分配。显然,堆的效率比栈要低得多。