1.简介
堆heap 栈stack是RAM(random access memory)中的两个区域
栈一般有固定值
堆一般则会有默认值default,但是可以增长
那么我们将如何在C++中可以控制性的进行堆或栈的内存分配(memory allocation)呢?比如怎么在堆空间中为某个变量分配内存或者栈空间?
struct Vector
{
float x, y, z;
};
int main()
{
//stack
int value = 10;
int array[5];
Vector myvector;
//heap
int* pvalue = new int;
*pvalue = 10;
int* parray = new int[5];
Vector* pvector = new Vector();
return 0;
}
2.栈内存初步解释
接下俩为刚才的栈上数组分配数值,不分配array就会是ccccc
int array[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
对其进行赋值的过程仅仅是&array向右移动(地址值加)多少个字节数。
i.e:array[2]就是&array向右移动了8个字节,原因在于: &array=&array[0],并且一个int占四个字节
仅仅是数组的地址发生移动进而为每个int进行操作,地址就是“索引”,借助索引来进行所有的操作
3.堆内存初步解释
同上,只是位置不同
4.回收内存
4.1栈回收内存是自动的,只要超出了这个变量的作用范围,编译器会自动回收。
比如在if/for语句中的声明定义的变量,一旦结束会自动回收
4.2堆中内存则必须要手动回收。
使用delete关键词
delete pvalue;
delete[] parray;//注意要delete[],否则仅仅是删除数组指针对应的堆空间,而没有删除数组内部的空间
delete pvector;
5.区别
在栈上分配内存的速度快于堆
因为堆使用new总是会调用malloc,而且会判断系统剩余内存是否多余所申请的内存等等过程
而这些过程栈空间申请都不需要,因此栈空间更快,性能更好。
而在堆上进行delete操作时,也会进行复杂(相比较栈)的过程,也会损失性能。
结论:如果可以尽可能使用栈空间,尤其是在局部变量,这样会大大增强程序的性能。但是如果有些全局变量则最好使用堆空间,毕竟栈空间有一定的生命周期。