zoukankan      html  css  js  c++  java
  • 数据在内存中的存放

    在计算机系统中,运行的应用程序的数据都是保存在内存之中

    不同类型的数据,保存的内存区域不同,其中包括:

    1->栈区(stack) 由编译器自动分配并释放,一般存放函数的参数值,局部变量等

    2->堆区(heap) 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收

    3->寄存器区 用来保存栈顶指针和指令指针

    4->全局区(静态区) 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放

    5->文字常量区 存放常量字符串,程序结束后由系统释放

    6->程序代码区 存放函数的二进制代码

    栈区中的数据

    应用程序启动后,操作系统会为应用程序在栈区中开辟内存空间,用于存放局部变量,以及函数的参数等

    iOS主线程栈区大小为1M,MAC主线程栈区大小为8M

    栈区中的变量由编译器负责分配和释放

    栈区中的数据是以“栈”的形式管理的,先进后出(FIBO)

    访问栈区中变量的效率高,不会出现内存碎片

    栈区中的变量名(不带*)相当于是指向栈区数据的指针别名,变量名可以简化程序员的工作

    堆区中的数据

    1->由于栈区中的空间有限,iOS的应用程序中,对象都是建立在堆中的

    2->堆区包括系统内存和虚拟内存(硬盘缓存),由所有正在运行的应用程序共享使用

    3->堆区中的内存分配由操作系统负责,操作系统使用一个链表统一维护所有已经分配的内存记录

    4->由于堆区是由所有应用程序共享的,操作系统以匿名(只记录内存地址和大小,不记录具体类型)的方式记录已经分配的内存区域

    5->要访问堆区中的数据,必须通过指针的方式才可以进行,指针的类型决定了访问堆中数据的方式

    6->当某一内存区域不再使用时,程序需要通知操作系统回收该内存区域,从而可以保证该内存区域被其他程序再次使用,否则,该区域将永远无法被再次分配,这就是传说中的“内存泄露”

    7->如果某一区域已经被释放,仍然视图访问该区域,会提示“坏内存访问”,这就是传说中的“野指针访问”

    8->相比较栈区,堆区中的效率要低很多,同时容易出现内存碎片

    9->相比较栈区,堆区中的访问方式更加灵活,对象占用的内存也可以更大

  • 相关阅读:
    百度mp3地址解密码
    VB 在EXE后附加信息
    截屏函数
    Base64和StrToByte
    The Android ION memory allocator, DMABUF is mentioned as well
    DDC EDID 介绍
    Memory management for graphic processors TTM的由来
    科普 写display driver的必看 How video card works [2D的四种主要操作]
    GEM vs TTM
    DMABUF 背景介绍文章 Sharing buffers between devices
  • 原文地址:https://www.cnblogs.com/bluceZ/p/3938452.html
Copyright © 2011-2022 走看看