iOS内存区域分布

摘要:
概览1,RAMROM2,内存的几大区域3,案例解释RAMROMRAM:运行内存,不能掉电存储。未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,在程序结束后有系统释放。堆是向高地址扩展的数据结构,是不连续的内存区域,以链表的方式进行存储。栈是向低地址扩展的数据结构,是不连续的内存区域,采用后进先出。

概览

1,RAM ROM

2,内存的几大区域

3,案例解释

RAM ROM

RAM:运行内存,不能掉电存储。

ROM:存储性内存,可以掉电存储,例如内存卡、Flash。

内存的几大区域

为了合理的分配有限的内存空间,将内存区域分为五个区,由低地址向高地址分类分别是:代码区、常量区、全局静态区、堆、栈

  • 代码区

用来存放函数的二进制代码,在运行时要防止被非法修改,只允许读取不允许操作

  • 常量区

存储常量数据,通常程序结束后由系统自动释放

  • 全局静态区

全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。全局变量和静态变量的存储是放在一块的。

初始化的全局变量和静态变量在一块区域。

未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,在程序结束后有系统释放。

由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。堆是向高地址扩展的数据结构,是不连续的内存区域,以链表的方式进行存储。

栈是由编译器自动分配并释放,存放函数的参数值,局部变量的值等。栈是向低地址扩展的数据结构,是不连续的内存区域,采用后进先出(LIFO )。

案例解释

int i = 10; //全局初始化
char *a; //全局未初始化区
- (void)test {
    int b;//栈区
    NSString *str = @"123";//常量区
    static int c = 0;//全局(静态)初始化区
    NSObject *obj = [[NSObject alloc]init];//堆区
}

免责声明:文章转载自《iOS内存区域分布》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇document.execCommand()的用法小记Git 常用命令速查表(图文+表格)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

面试必问:JVM类加载机制详细解析

前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点。 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是class文件。平常我们写的Java文件,需要编译为class文件才能交给JVM运行。可以这么说:C语言代码——>二进制文件——>计算机硬件,就相当于...

9-FreeRTOS API获取任务使用CPU时间

获取CPU时间的API: vTaskGetRunTimeStats() 获取任务运行时间信息,此函数会统计任务的运行时间,并且将统计到的运行时间信息按照表格的形式组织在一起并存放在用户设置的缓冲区里面,缓冲区的首地址通过参数传递给函数 vTaskGetRunTimeStats()。   获取前期准备: (1)开启宏configGENERATE_RUN_TI...

Node.js server使用

一、创建项目 #创建项目目录 cd /data mkdir webroot cd webroot #初始化git git init vim .gitignore 输入: node_modules/ 保存: :wq #初始化npm,生成package.json npm init #安装express npm install -D express #...

Swift-可选值(Optional)讲解

前提:Swift中有规定:对象中的任何属性在创建时,都必须要有明确的初始化值 1.定义可选类型 方式一:常规方式(不常用) var name : Optional<String> = nil 方式二:语法糖(常用) var name:String? = nil Optional理解:   Optional也是Objective-C没有的数据类型...

Java的静态代码块是否会在类被加载时自动执行?

JAVA静态代码块会在类被加载时自动执行?一、先看Java静态方法,静态变量 http://www.cnblogs.com/winterfells/p/7906078.html 静态代码块 在类中,可以将某一块代码声明为静态的,这样的程序块叫静态初始化段。静态代码块的一般形式如下: static { 语句序列 } public class stat...

ExecuteReader: Connection 属性尚未初始化。错误解决

读取student表中的数据打印到屏幕,代码 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string sqlc = @"server=.\sqlexpress;database=MyDataBase1...