zoukankan      html  css  js  c++  java
  • 数据结构与算法--堆(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.申请后系统响应

    • :只要剩余空间大于申请空间,系统就给内存,否则报栈溢出
    • :略复杂,查链表,找第一个大于申请大小的空间,分配。多余的重新放入空闲链表
  • 相关阅读:
    mongoDB 获取系统时间
    android应用程序监听SMS Intent广播
    安卓开发之探秘蓝牙隐藏API
    Android内存优化解决 资料和总结的经验分享
    android 访问SMS短信收件箱
    Android 和 PHP 之间进行数据加密传输
    Android开发 MMS支持 创建和编辑MMS
    android 动态改变屏幕方向
    Android 使用 Gmail 来发送邮件
    android数据库操作之直接读取db文件
  • 原文地址:https://www.cnblogs.com/CocoML/p/12726999.html
Copyright © 2011-2022 走看看