网站的用户体验怎么做,5个搜索引擎作弊的网站,郑州做网站 码通,教你如何在wordpress中设置cookie本节对堆和栈内存进行描述。
应用程序启动后#xff0c;操作系统将整个程序加载到内存#xff0c;分配相应的物理ram#xff0c;确保程序可以正常运行。堆和栈是ram中存在的两个区域。栈通常是一个预定义大小的内存区域#xff0c;一般是2M字节左右。堆也是预定了默认值的…本节对堆和栈内存进行描述。
应用程序启动后操作系统将整个程序加载到内存分配相应的物理ram确保程序可以正常运行。堆和栈是ram中存在的两个区域。栈通常是一个预定义大小的内存区域一般是2M字节左右。堆也是预定了默认值的区域但可以随着程序的运行变大。 #include iostreamstruct 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] i5;}Vector3* hvector new Vector3;std::cin.get();
} 栈内存分配 下图是展示的内存地址是栈上array的内存地址可以看到在内存上市连续的20个字节的大小因为一个int是4字节。在array附近可以看到05 00 00 00这是value的内存地址中间多了一些字节是因为现在是在Debug模式下中间添加的是安全守卫在所有变量的周围都会添加确保内存溢出不是改变所有变量等。继续执行下入红色的字节表示的是vector的字节中间插入的仍是安全守卫。 堆内存分配 继续执行上述程序在内存中可以看到hvalue的值以及内存地址继续执行查看harray的从从下图可以看到和hvalue的内存地址相差很远。在堆中申请内存需要程序员自己去释放内存而在栈中超出作用域后会自动释放内存。如下所示 #include iostreamstruct 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] i5;}Vector3* hvector new Vector3;delete hvalue;delete[] harray;delete hvector;std::cin.get();
} new操作符实际上调用了一个malloc的函数从堆上分配内存程序会维护一个空闲链表用来跟踪哪些内存块是空闲的。 栈分配比堆分配效率高的原因 在栈上分配内存仅仅是一条cpu指令而在堆上 需要执行很多操作所以在栈上分配执行效率比在堆上分配高很多。下面通过查看生成的汇编代码来证实。 如上图显示在通过栈给value分配内存是仅仅需要执行一条cpu指令。 上图现在在堆上则需要执行7条cpu指令才能给hvalue分配内存。 生成汇编的设置方法如下