本节对堆和栈内存进行描述。
#include <iostream>
struct Vector3
{
float x, y, z;
Vector3()
:x(1),y(2),z(3)
{}
};
int main()
{
//在栈上分配内存
int value = 5; //整数
int array[5]; //数组
for (int i = 0; i < 5; i++)
{
array[i] = i;
}
Vector3 vector; //类或者结构体
//在堆上分配,使用new操作符在堆上进行分配
int* hvalue = new int;
*hvalue = 5;
int* harray = new int[5];
for (int i = 0; i < 5; i++)
{
harray[i] = i+5;
}
Vector3* hvector = new Vector3;
std::cin.get();
}
#include <iostream>
struct Vector3
{
float x, y, z;
Vector3()
:x(1),y(2),z(3)
{}
};
int main()
{
//在栈上分配内存
int value = 5; //整数
int array[5]; //数组
for (int i = 0; i < 5; i++)
{
array[i] = i;
}
Vector3 vector; //类或者结构体
//在堆上分配,使用new操作符在堆上进行分配
int* hvalue = new int;
*hvalue = 5;
int* harray = new int[5];
for (int i = 0; i < 5; i++)
{
harray[i] = i+5;
}
Vector3* hvector = new Vector3;
delete hvalue;
delete[] harray;
delete hvector;
std::cin.get();
}
new操作符实际上调用了一个malloc的函数从堆上分配内存,程序会维护一个空闲链表,用来跟踪哪些内存块是空闲的。
在栈上分配内存仅仅是一条cpu指令,而在堆上, 需要执行很多操作,所以在栈上分配执行效率比在堆上分配高很多。下面通过查看生成的汇编代码来证实。
如上图显示,在通过栈给value分配内存是,仅仅需要执行一条cpu指令。
上图现在,在堆上则需要执行7条cpu指令,才能给hvalue分配内存。
生成汇编的设置方法如下: