首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS底层—OC对象的本质与isa

三.联合体位域简述 在学习isa之前,先了解一下联合体以及位域。...1.位域 引入一个案例,定义一个结构体Car,体现车的运动方向,见下面代码: 这样看上去是可以满足的的业务需求的,但是这里有个问题,这个结构体需要占用4个字节32位,使用4个字节去体现一个单一功能有些浪费空间...理论上,一个字节就可以体现车的运动状态,改进一下,见下图: 这里使用了位域,用位来体现一个功能,比如有值就是用1,没有值就是用0。...结构体(struct)特点总结如下: 优点:共存,有容乃⼤,全⾯; 缺点:struct内存空间的分配是粗放的,不管⽤不⽤,全分配。 3.联合体特点 同样引入一个案例,来区分结构体和联合体的区别!...四.isa探索 1.isa_t联合体 通过上面的案例,认识到了联合体与结构体的区别,同时了解到位域在节省内存方面的优势。而isa,就是采用联合体结合位域,对数据进行了封装。

55810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言:--位域和内存对齐

    这节写点什么,就写位域和内存对齐吧。 位域 位域是指信息在保存时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位。为了节省空间,C语言提供了一种数据结构,叫“位域”或“位段”。...“位域“是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数,每个域有一个域名,允许在程序中按位域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。...位域的使用和结构成员的使用相同,其一般形式为:位域 变量名.位域名 位域允许用各种格式输出。 1. 在C中,位域可以写成这样(注:位域的数据类型一律用无符号的,纪律性)。...位域的使用主要出现在如下两种情况: (1)当机器可用内存空间较少而使用位域可以大量节省内存时。如,当把结构作为大数组的元素时。 (2)当需要把一结构或联合映射成某预定的组织结构时。...最后还要强调一遍:位域又叫位段(位字段),是一种特殊的结构成员或联合成员(即只能用在结构或联合中). 2. 内存对齐: ---- 1.

    3K30

    一文轻松理解内存对齐

    pack指定的数值和这个数据成员自身长度中,比较小的那个进行; 结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构...4个字节,所以有效对齐单位为4字节,下面根据上面所说的规则以第二个结构体来分析其内存布局:首先使用规则1,对成员变量进行对齐: sizeof(c1) = 1 位),按照1字节对齐,占用第...一般地,可以通过下面的方法来改变缺省的对界条件: 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。 使用伪指令#pragma pack (),取消自定义字节对齐方式。...,a占第一字节的6位,后2位填0表示不使用,b从第二字节开始,占用4位,c占用4位。...内存结构如下图所示。 ? 存储结构图 (2)由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是不能超过8位二进位。 (3)位域可以无位域名,这时它只用来填充或调整位置。

    30810

    C语言 | C++内存对齐

    pack指定的数值和这个数据成员自身长度中,比较小的那个进行; 结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构...4个字节,所以有效对齐单位为4字节,下面根据上面所说的规则以第二个结构体来分析其内存布局:首先使用规则1,对成员变量进行对齐: sizeof(c1) = 1 位),按照1字节对齐,占用第...一般地,可以通过下面的方法来改变缺省的对界条件: 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。 使用伪指令#pragma pack (),取消自定义字节对齐方式。...内存结构如下图所示。 存储结构图 (2)由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是不能超过8位二进位。 (3)位域可以无位域名,这时它只用来填充或调整位置。...无名的位域是不能使用的。

    3.5K89

    一文轻松理解内存对齐

    pack指定的数值和这个数据成员自身长度中,比较小的那个进行; 结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构...4个字节,所以有效对齐单位为4字节,下面根据上面所说的规则以第二个结构体来分析其内存布局:首先使用规则1,对成员变量进行对齐: sizeof(c1) = 1 位),按照1字节对齐,占用第...一般地,可以通过下面的方法来改变缺省的对界条件: 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。 使用伪指令#pragma pack (),取消自定义字节对齐方式。...,a占第一字节的6位,后2位填0表示不使用,b从第二字节开始,占用4位,c占用4位。...内存结构如下图所示。 ? 存储结构图 (2)由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是不能超过8位二进位。 (3)位域可以无位域名,这时它只用来填充或调整位置。

    12.5K53

    对象原理探究(二)

    接下来介绍一下联合体和位域的概念 先来看一个例子: 现在有一个坦克类,它有4个属性:向前、向后、向左、向右,如下: @interface NormanTank : NSObject @property...因此,我就可以定义一个char类型(char是一个字节),一个char有8位,我们就可以使用这8位中的后4位来分别定义前后左右了。这样就能节省很多内存空间。...【联合体和位域的概念这里没有总结完,需要后期详细总结。这里只需要知道isa是一个联合体位域的结构即可】。...isa联合体中有定义位域,它是一个宏,之所以将它定义成宏,是因为这个位域是跟架构有关的,如下: ?...除了根据bits来知道isa指针占8个字节,根据位域ISA_BITFIELD也可以知道。位域ISA_BITFIELD是一个结构体,而结构体里面的内容算一下的话也是64位,即8个字节: ?

    39010

    OC底层探索06-isa本身藏了多少信息你知道吗?OC底层探索06-isa本身藏了多少信息你知道吗?

    联合体、位域 联合体 因为在isa使用了一种位域技术,来保存内部信息,这里简单介绍一下联合体、位域 联合体(union):各变量是“互斥”的,同时只能有一个变量有值,且公用同一块内存。...优点是内存使用更为精细灵活,也节省了内存空间。C语言共用体详解 位域 如果有一个需求,需要能表达东南西北四个方向。第一想到的就是创建4个Bool值来进行控制,可是4个Bool需要:4个字节。...现在需求变了,需要还能表达东南,西南,西北,东北,继续创建Bool来控制吗?而且太笨了。。。 如果通过这样一个结构来描述呢?...Style_月月-简书 根据位域的知识,再来看这幅图中的结构,有木有豁然开朗。 从上至下,对应二进制的从低位到高位。每一位都存满了各种类的信息。...(这个是通过多次试验得出,如果有问题或者知道如何验证,希望不吝赐教)需要注意isa结构中类的信息是从第4位开始的,只要将isa的后3位改为0就可以直接得到类信息,所以在保存的时候需要将类指针进行位移(uintptr_t

    36630

    5分钟带你了解位段

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 对于结构体内部的成员来说,有时候一个int成员的取值是非常有限的,比如一个人的年龄最多只要8个比特位就够了。...有些成员甚至只要3个比特位就够了。如果给一个整形的空间似乎有点多,这时就可以使用位段。 一、什么是位段 位段又称为位域是以位为单位来定义结构体(或联合体)中的成员变量所占的空间。...位段中的位指二进制位 位段的声明和结构是类似的,有两个不同: 1. 位段的成员必须是 int 、 unsigned int 或 signed int 。 2....位段的空间上是按照需要以 4 个字节( int )或者 1 个字节( char )的方式来开辟的。...以此类推······ 三:位段的作用 1.优点 其实位段设计出来他的作用和结构体是类似的,他的成员通过加上位后使得节省了空间。

    14810

    【C语言进阶篇】 位段 枚举 联合 —— 自定义类型的详细解析!

    位段   ⛳️一般情况下在书里,结构体的章节过来了之后就是位段(位域)叫法不同而已,说明我们的位段是靠结构体来实现的!...什么是位段 位段的声明和结构是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或signed int 。 2.位段的成员名后边有一个冒号和一个数字。...就算是按4个整形计算也不可能是8个字节啊 下面我们就来介绍一下位段的内存是如何分配的! 注:结构体如何计算大小文章链接《结构体的内存对齐》   ⛳️ 位段位段,说明他是位的截段 那么是什么位呢?...其实和结构体差不多 枚举类型的关键字是 enum 那么我们来假设定义一下三元色 (红,绿色,黑色) 代码演示: enum Color//颜色 { RED, GREEN, BLUE };...他的关键字是 union 联合类型的定义 ⛳️ 那么我们如何定义联合体呢?

    16710

    嵌入式笔试面试题目系列(二)

    局部变量经常被称为自动变量,因为它们在进入作用域时自动生成,离开作用域时自动消失。关键字auto可以显式地说明这个问题,但是局部变量默认为auto,所以没有必要声明为auto。...(说明:按几字节对齐,是根据结构体的最长类型决定的,这里是int是最长的字节,所以按4字节对齐); 2.使用64位编译 ,int占4, char 占1, unsigned short 占2,char*...引申:位域(大疆笔试题) C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。...a4 :局部变量;生命周期为fun函数运行期间;作用域为fun函数内部;储存位置为栈。 a5 :局部易变变量; 14、使用32位编译情况下,给出判断所使用机器大小端的方法。 ?...联合体方法判断方法:利用union结构体的从低地址开始存,且同一时间内只有一个成员占有内存的特性。大端储存符合阅读习惯。联合体占用内存是最大的那个,和结构体不一样。

    71530

    offset size_c语言sizeof求结构体长度

    既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),64位系统中指针变量的sizeof结果为8。...试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。...如下: struct S5 { }; sizeof( S5 ); // 结果为1 含位域结构体的sizeof 前面已经说过,位域成员不能单独被取sizeof值,我们这里要讨论的是含有位域的结构体的sizeof...C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。...使用位域的主要目的是压缩存储,其大致规则为: 1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止; 2) 如果相邻位域字段的类型相同

    68910

    C语言字节对齐#pragma pack()

    结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则: 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍...扩展概念 位域对齐 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。...为了节省存储空间和处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。...位域是一种特殊的结构成员或联合成员(即只能用在结构或联合中),用于指定该成员在内存存储时所占用的位数,从而在机器内更紧凑地表示数据。每个位域有一个域名,允许在程序中按域名操作对应的位。...这样就可用一个字节的二进制位域来表示几个不同的对象。 可以继续查看相关博文,在下现在没有对此没有需求,先Mark一下:相关博文

    1.6K20

    C语言-----自定义类型-----结构体&枚举&联合

    ; 4.结构的自引用 一个结构体里面不能够包含一个相同的结构体,但是我们可以使用结构体指针,线性数据结构包括顺序表和链表,顺序表就是按照一定的顺序依次排列的结构,链表就是像链子一样串连起来的结构,链表包括数据域和指针域...员); (5)根据结构体的对齐规则,我们应该尽量让小的结构体成员放在一起,大的结构体成员放在一 起,这样就可以节省时间和空间; 6.结构体实现位段功能 (1)位段中的位是指二进制位,一个二进制位是一个比特...,举个例子:int a:2;正常情况下,一个整型a 要占4个字节,也就是32个比特位,但是我们只为他分配2个比特位来存放数据,2的二进制表示是 0020,2个比特位就存放后两位20,这样就节省了6个比特位...,由此可见,位段就是为了节省内存 空间,但是位段不具有跨平台性; (2)位段有时候几个成员共同使用1个字节,所以不能对他直接取地址,所以应该定义变量,对变 量输入一个值,然后将这个变量的值赋值给结构体的成员...,所以联合体的使用条件就是联合体的成员不会同时使用,互不影响; 这个案例是使用匿名联合体判断机器是大端还是小端; 10.联合体的大小 联合体的大小至少是最大成员的大小; 但是通过上面这个案例,我们可以知道联合体也有对齐现象

    7710

    干货 | 结构体、联合体嵌套使用的一些实用操作

    定义一个联合类型的一般形式为: union 联合名 { 成员表 }; 成员表中含有若干成员,成员的一般形式为:类型说明符 成员名。其占用的字节数与成员中最大数据类型占用的字节数。...下面我们一起看一下结构体、联合体结合使用在C语言、嵌入式中的一些实用技巧。...2、寄存器、状态变量封装 我们看一看TI的寄存器封装是怎么做的: 所有的寄存器被封装成联合体类型的,联合体里边的成员是一个32bit的整数及一个结构体,该结构体以位域的形式体现。...: GpioCtrlRegs.GPAQSEL1.all |=0x03 位域相关文章:【C语言笔记】位域 如果不是工作于芯片原厂,寄存器的封装应该离我们很远。...但无论如何,我们组包发送的过程是填充结构体->发送data_buffer;反之接收数据解析的过程就是接收数据存于data_buffer->使用结构体数据。

    3.6K30

    C语言位操作 | 按位运算符

    例如: unsigned char//用一个字节表示的范围是0~255 signed char//用一个字节表示的范围是-128~+128 有符号整数 如何表示有符号整数取决于硬件,而不是C语言。...位字段 位字段是一种在C语言的结构体和联合体中定义结构化数据的方法,允许把一个字节或多个字节的内存空间划分为几个不同的二进制位域。...每个位域代表一个独立的二进制位,用于存储特定的数据,可以节省内存空间和提高效率。位字段可以通过定义结构体或联合体以及通过在结构体或联合体中定义每个位域的大小来实现。...示例 位字段是C语言提供的一种结构体的数据结构,通过把比特位分配到结构体的成员变量中来存储一些小数据。...比特位在计算机编程中有很多用途,主要是在存储和处理数据时的状态表示。比如,可以使用一个比特位来表示一个特定的选项是否开启或关闭,或者在内存的一个字节中的多个比特位上的组合来表示特定的状态。

    1.4K10

    结构体位域和__attribute__ ((__packed__))一起用

    1 结构体位域 1.1 位域 位域是一种节省空间的数据结构,是把一个数据类型按照二进制(二进位)划分为几个不同的区域,并说明每个区域的位数。...比如有一个字节,每一位表示一个开关状态,就可以使用位域,解析也方便。...4)如果位域字段之间穿插着非位域字段,则不进行压缩。 5)整个结构体的总大小为最宽基本类型成员大小的整数倍,和普通结构体一样。...3 联合使用 对于一些特殊的协议,比如sbus,sbus一个通道占11位,那按照位域的规则,下属代码中的channel3就要在存储在下一个unsigned int中了。...对于一些这种特殊协议的,这样联合使用比较方便。

    28020

    sizeof 知多少? (上)

    基本类型 像 char, int 等基本类型的 sizeof 大小应该属于基本常识了,值得注意的一点是部分基本类型在32位系统和64位系统中具有不同大小(譬如 long 类型在32位系统中一般为4字节大小...由于存在上面的数据对齐问题,编译器在为结构体生成内存布局的时候,会在结构体的数据成员之间填充数据,以使结构体的各个成员都能满足内存对齐需求。...由于联合体需要共用内存,所以其大小是其成员的最大大小,再加上根据联合体对齐值进行填充的数据大小(需要填充的原因和结构体一致),而联合体的对齐值则跟结构体一样,为其成员的最大对齐值 使用公式依然会更清晰一些...) 除了union,在C/C++中还可以通过设置位域来实现数据的紧凑存储,考虑下面的定义: struct s4 { int m_1 : 16; int m_2 : 8; int...一般来讲,相邻并且类型相同的位域数据成员会被打包在一起存储,直到成员的位宽之和超过类型大小,或者遇到不同类型的数据成员(包括非位域数据成员),其中也会进行成员的内存对齐和最后的结构填充.

    92600
    领券