数据结构与算法--堆(heap)与栈(stack)的区别

堆和栈的区别

在C、C++编程中,经常需要操作的内存可分为以下几个类别:

  • 栈区(stack):由编译器自动分配和释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。
  • 堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时间可能由操作系统回收。和数据结构中的堆是两码事,分配方式类似链表
  • 全局区(静态区,static):全局变量和静态变量存储是放在一块的,初始化的全局变量和静态变量是在一块区域,未初始化的全局变量和未初始化的静态变量是在相邻的另一块。程序结束后由系统释放。
  • 文字常量区:常量字符串就是放在这里。程序结束后由系统释放。
  • 程序代码区:存放函数体的二进制代码。
//main.cpp
Int a= 0;		//全局初始化区
Char *p1;	//全局未初始化区
main ()
{
	int b;	//栈
	char s[] = “abc”;	//栈
	char *p2;		//栈
	char *p3 = “123456”;		//123456在常量区,p3在栈
	static int c = 0;	//全局静态初始化区

	p1 = (char *)malloc(10);
	p2 = (char *)malloc(20);	// 分配得来的10和20字节的区域就在堆区
	strcpy(p1, “123456”);		//123456放在常量区,编译器可能会将它与p3所指的地址优化为同一个地方
}
  1. 申请方式和申请效率
  • :系统自动分配。速度较快
  • :程序员自己申请,并指明大小。C中用malloc函数,C++中用new(一般较慢,容易产生内存碎片,不过用起来方便)

2.申请后系统响应

  • :只要剩余空间大于申请空间,系统就给内存,否则报栈溢出
  • :略复杂,查链表,找第一个大于申请大小的空间,分配。多余的重新放入空闲链表

猜你喜欢

转载自www.cnblogs.com/CocoML/p/12726999.html