iOS——内存五大分区

五大分区

从高地址到低地址分别为:栈区、堆区、全局区/静态区、常量区、代码区
在这里插入图片描述

五大分区的作用

  • 栈区是用于存放程序临时创建的变量、存放函数的参数值、局部变量等。栈区地址从高到低分配,遵循先进后出(FILO)原则。 一般在运行时进行分配,内存空间由系统管理,变量过了作用域范围后内存便会自动释放,程序员不需要管理栈区变量的内存。
  • 堆区由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如变量通过new、alloc、malloc、realloc分配的内存块就存放在堆区。堆向高地址扩展的数据结构,是不连续的内存区域。 程序员负责在何时释放内存,在ARC程序中,计数器为0的时候,在当次的runloop结束后,释放掉内存。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。对于堆来讲,频繁的new/delete势必会造成内存空间的不连续性,从而造成大量的碎片 ,使程序效率降低。
  • 全局区/静态区 可分为未初始化全局区(BSS段)和初始化全局区(DATA段)。全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。
  • 常量区常用于存放整型、字符型、浮点、字符串等常量。该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
  • 代码区 用来存放函数的二进制代码。 代码段需要防止在运行时被非法修改,所以只允许读取操作,而不允许写入操作。

一些注意

  1. 在iOS中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;
  2. 系统使用一个链表来维护所有已经分配的内存空间(系统仅仅纪录,并不管理具体的内容);
  3. 当一个app启动后,代码区,常量区,全局区大小已固定,因此指向这些区的指针不会产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(也即是野指针报错)。
  4. RAM:运行内存,不能掉电存储。ROM:存储性内存,可以掉电存储,例如内存卡、Flash。由于RAM类型不具备掉电存储能力(即一掉电数据消失),所以app程序一般存放于ROM中。RAM的访问速度要远高于ROM,价格也要高。

static、extern、const关键字比较

static

  • 作用:
  1. 可以修饰局部变量,将局部变量存储到静态存储区。
  2. 可以修饰全局变量,限定全局变量只能在当前源文件中访问。
  3. 可以修饰函数,限定该函数只能在当前源文件调用。
  • 优点:
    不管对象方法还是类方法都可以访问和修改全局静态变量,并且外部类无法调用静态变量,定义后只会指向固定的指针地址,供所有对象使用,节省空间。
  • 缺点:
    存在的生命周期长,从定义直到程序结束。

从内存优化和程序编译的角度来说,尽量少用全局静态变量,因为存在的生命周期长,一直占用空间。程序运行时会单独加载一次全局静态变量,过多的全局静态变量会造成程序启动慢。

局部静态变量

  • 优点:
    定义后只会存在一份值,每次调用都是使用的同一个对象内存地址的值,并没有重新创建,节省空间,只能在该局部代码块中使用。

  • 缺点:
    存在的生命周期长,从定义直到程序结束,只能在该局部代码块中使用。

局部和全局静态变量从本根意义上没有什么区别,只是作用域不同而已。如果值仅一个类中的对象和类方法使用并且值可变,可以定义全局静态变量,如果是多个类使用并可变,建议值定义在model作为成员变量使用。如果是不可变值,建议使用宏定义。

extern

extern关键字用于声明一个全局变量或函数在另一个文件中定义。它告诉编译器这个变量或函数是在别处定义的,而不是在当前文件中定义的。extern的主要作用是用于跨文件共享变量或函数。

extern分为对内的局部变量和外部全局变量。

对内的局部变量

  • 优点:
    不管对象方法还是类方法都可以访问和修改全局静态变量,并且外部类无法调用静态变量,定义后只会存一份值,供所有对象使用,节省空间。跟全局静态变量一样,只是少了static修饰少了static特性。
  • 缺点:
    存在的生命周期长,从定义直到程序结束。

不如用全局静态变量,至少能明确的知道static是对内使用的。

外部全局变量

  • 优点:
    除了该类,其他文件也可以访问该变量。
  • 缺点:
    存在的生命周期长,从定义直到程序结束。并且外部可以修改其值,出现错误不容易定位。

使用全局变量的原因就在于其对外的特性,但是其使用的方便性没有使用model的属性或宏来得方便。程序启动的时候会单独加载全局变量,同理与全局静态变量,少使用。

const常量

不同于变量,常量的值是固定不可变的,一般用于只读值。

  • 优点:
    只可以读取值,不能修改。一般用于接口或者文字显示这种固定值。添加extern可以对外全局常量,任意位置都可以访问。
  • 缺点:
    存在的生命周期长,从定义直到程序结束。需要在.h .m中分别定义代码较多。

良好的编码习惯而言,少使用宏,多使用常量。因为常量声明是有明确类型的,而宏只是替换并不能进行类型判断。不够严谨。

### OSPF区域的概念 OSPF(Open Shortest Path First)是一种基于链路状态的内部网关协议,广泛应用于企业网络和互联网服务提供商环境中。为了简化管理并减少路由器内存消耗以及CPU开销,OSPF支持将自治系统划分为多个逻辑组,这些逻辑组被称为区域[^1]。 #### 区域的作用 通过划分区域可以有效地控制LSA泛洪范围,从而降低路由器处理负担。每个区域内维护独立拓扑数据库,并仅向其他区域传播汇总路由信息而非具体细节[^2]。 ### OSPF区域的工作原理 - **骨干区域 (Area 0)** 所有非零号区域都需直接或者间接连接到此特殊编号为`0.0.0.0`的核心部分;它是整个OSPF网络结构中的中心节点[^3]。 - **标准区域** 这些普通的非骨干区域能够正常学习来自外部源地址前缀的信息,但不允许存在虚链接穿越其中[^4]。 - **Stub区域** Stub类型的设定旨在进一步缩小边界限制——它会阻止第四类(LSA Type-4)及以上级别的通告进入该特定地理范围内,只保留默认路由指向最近ABR(区域边界路由器)[^5]。 - **Totally Stubby Area** 它不仅屏蔽第五型外加第三种以上的更新消息传递进来,而且连第二级内部AS间互联成本计算也停止了,仅仅依靠单一缺省路径指引数据包转发方向[^6]。 - **Not-so-stubby area (NSSA)** NSSA允许引入外部路由而不违反STUB原则,在这种情况下会产生第七类型(NSSA-specific LSA),当到达出口位置时转换成常规形式再广播出去[^7]。 ### 基本配置命令示例 以下是针对思科设备平台上的简单设置说明: ```cisco-ios router ospf 1 network 192.168.1.0 0.0.0.255 area 0 ! interface GigabitEthernet0/1 ip address 192.168.1.1 255.255.255.0 ``` 上述脚本定义了一个属于AREA 0 的子网接口[GigabitEthernet0 / 1], 并启用了相应的OSPF进程实例ID `1`. 对于更复杂的场景比如创建stub区域,则需要额外指定参数: ```cisco-ios area 1 stub no-summary ``` 这句指令把AREA 1 设置成了不发送summary LSA给邻居的一个纯stuby zone. ### 总结 合理规划与实施OSPF分区策略有助于提升大型IP通信系统的效率及稳定性。不同种类的功能模块提供了灵活的选择来满足多样化的业务需求[^8].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值