• 数据结构与算法--堆(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.申请后系统响应

    • :只要剩余空间大于申请空间,系统就给内存,否则报栈溢出
    • :略复杂,查链表,找第一个大于申请大小的空间,分配。多余的重新放入空闲链表
  • 相关阅读:
    Oracle 11G单机 无网络环境静默安装
    Centos 7 编译安装llvm 8.0.0
    linux下测试读写
    Linux 初始化 init 系统(1):sysvinit
    自动挂载文件/etc/fstab功能详解
    虚拟机安装LINUX网络配置注意的问题
    rhel7报错整理
    16/4/4二代支付硬盘故障处理
    RedHat Enterprise Linux 7关闭防火墙方法
    Linux命令之awk数组使用范例
  • 原文地址:https://www.cnblogs.com/CocoML/p/12726999.html
Copyright © 2020-2023  润新知