区块链技术博客
www.b2bchain.cn

iOS的内存对齐求职学习资料

本文介绍了iOS的内存对齐求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

目录

  • 为什么要内存对齐
  • pragma pack
  • 对齐规则
  • 三个函数的分析
  • 总结

为什么要内存对齐?

其一,为了方便移植。
CPU是一块块的进行进行内存访问。有一些硬件平台不允许随机访问,只能访问对齐后的内存地址,否则会报异常。

很多 CPU(如基于 Alpha,IA-64,MIPS,和 SuperH 体系的)拒绝读取未对齐数据。当一个程序要求这些 CPU 读取未对齐数据时,这时 CPU 会进入异常处理状态并且通知程序不能继续执行。举个例子,在 ARM,MIPS,和 SH 硬件平台上,当操作系统被要求存取一个未对齐数据时会默认给应用程序抛出硬件异常。(https://www.jianshu.com/p/a371e2613ec8)

其二,为了提高CPU内存访问速度。
CPU访问非对齐的内存时需要进行多次拼接。如下图,比如需要读取从[2, 5]的内存,需要分别读取两次,然后还需要做位移的运算,最后才能得到需要的数据。这中间的损耗就会影响访问速度。
iOS的内存对齐

#pragma pack

宏命令#pragma pack会告诉编译器如何进行内存对齐。XCODE中默认为#pragma pack(8)。其接受的参数为:’1′, ‘2’, ‘4’, ‘8’, or ’16’。

对齐规则

  • 第一个成员在与结构体变量偏移量为0的位置处。
  • 其他成员变量要对齐到某数的整数倍的地址处。某数的取值为编译器默认的一个对齐数(#pragma pack(8))与该成员大小的较小者。
  • 最后总的大小为其最大成员的整数倍。如果成员中有结构体,那么这个成员的大小为该结构体内的最大成员的大小。

举例一,

 MyAnimal : NSObject{     // *isa 8字节     int _age; } MyAnimal   NSLog(@"class_getInstanceSize = %zu",class_getInstanceSize([myAnimal class])); NSLog(@"malloc_size = %lu",malloc_size(CFBridgingRetain(myAnimal))); NSLog(@"sizeof = %lu",sizeof(myAnimal));

这段代码的输出是:

class_getInstanceSize = 16 malloc_size = 16 sizeof = 8

这里你只需要关注class_getInstanceSize的大小,暂时不用管malloc_size,与sizeof的值。

举例二,

 MyAnimal : NSObject{     // *isa 8 (0-8)     int _age; // 4 (8-12)     char c0; // 1 (13)     char c1; // 1 (14) }  /* 括号内为内存位置,(0-8)表示放置在0,1,2,3...7的位置上。首先按照规则1,2计算出来内存大小为14,再按照规则3,按照8的倍数对齐,则得出16个字节的结果。  输出为: class_getInstanceSize = 16 malloc_size = 16 sizeof = 8 、 */

举例三,

 MyAnimal : NSObject{     // *isa 8 (0-8)     char c0; // 1 (8-9)     int _age; // 4 (12-16)     char c1; // 1 (17) }  /* 括号内为内存位置,(0-8)表示放置在0,1,2,3...7的位置上。首先按照规则1,2计算出来内存大小为17,再按照规则3,按照8的倍数对齐,则得出24个字节的结果。  输出为: class_getInstanceSize = 24 malloc_size = 32 sizeof = 8 、 */

三个函数

class_getInstanceSize函数表示按照#pragma pack该宏对齐内存之后的大小。
malloc_size函数则是按照16位对齐之后的大小。
sizeof该运算符只是返回类型的大小,而非实际的内存。

问题

尝试在xcode中修改#pragma pack(16),好像没有生效。stackoverflow上有人指出可以这么设置内存对齐。

struct foo {   uint8_t bar;   uint8_t baz; } __attribute__((packed));

总结

主要讲了内存对齐的三个原则,以及介绍了三个函数的区别。

目录

  • 为什么要内存对齐
  • pragma pack
  • 对齐规则
  • 三个函数的分析
  • 总结

为什么要内存对齐?

其一,为了方便移植。
CPU是一块块的进行进行内存访问。有一些硬件平台不允许随机访问,只能访问对齐后的内存地址,否则会报异常。

很多 CPU(如基于 Alpha,IA-64,MIPS,和 SuperH 体系的)拒绝读取未对齐数据。当一个程序要求这些 CPU 读取未对齐数据时,这时 CPU 会进入异常处理状态并且通知程序不能继续执行。举个例子,在 ARM,MIPS,和 SH 硬件平台上,当操作系统被要求存取一个未对齐数据时会默认给应用程序抛出硬件异常。(https://www.jianshu.com/p/a371e2613ec8)

其二,为了提高CPU内存访问速度。
CPU访问非对齐的内存时需要进行多次拼接。如下图,比如需要读取从[2, 5]的内存,需要分别读取两次,然后还需要做位移的运算,最后才能得到需要的数据。这中间的损耗就会影响访问速度。
iOS的内存对齐

#pragma pack

宏命令#pragma pack会告诉编译器如何进行内存对齐。XCODE中默认为#pragma pack(8)。其接受的参数为:’1′, ‘2’, ‘4’, ‘8’, or ’16’。

对齐规则

  • 第一个成员在与结构体变量偏移量为0的位置处。
  • 其他成员变量要对齐到某数的整数倍的地址处。某数的取值为编译器默认的一个对齐数(#pragma pack(8))与该成员大小的较小者。
  • 最后总的大小为其最大成员的整数倍。如果成员中有结构体,那么这个成员的大小为该结构体内的最大成员的大小。

举例一,

 MyAnimal : NSObject{     // *isa 8字节     int _age; } MyAnimal   NSLog(@"class_getInstanceSize = %zu",class_getInstanceSize([myAnimal class])); NSLog(@"malloc_size = %lu",malloc_size(CFBridgingRetain(myAnimal))); NSLog(@"sizeof = %lu",sizeof(myAnimal));

这段代码的输出是:

class_getInstanceSize = 16 malloc_size = 16 sizeof = 8

这里你只需要关注class_getInstanceSize的大小,暂时不用管malloc_size,与sizeof的值。

举例二,

 MyAnimal : NSObject{     // *isa 8 (0-8)     int _age; // 4 (8-12)     char c0; // 1 (13)     char c1; // 1 (14) }  /* 括号内为内存位置,(0-8)表示放置在0,1,2,3...7的位置上。首先按照规则1,2计算出来内存大小为14,再按照规则3,按照8的倍数对齐,则得出16个字节的结果。  输出为: class_getInstanceSize = 16 malloc_size = 16 sizeof = 8 、 */

举例三,

 MyAnimal : NSObject{     // *isa 8 (0-8)     char c0; // 1 (8-9)     int _age; // 4 (12-16)     char c1; // 1 (17) }  /* 括号内为内存位置,(0-8)表示放置在0,1,2,3...7的位置上。首先按照规则1,2计算出来内存大小为17,再按照规则3,按照8的倍数对齐,则得出24个字节的结果。  输出为: class_getInstanceSize = 24 malloc_size = 32 sizeof = 8 、 */

三个函数

class_getInstanceSize函数表示按照#pragma pack该宏对齐内存之后的大小。
malloc_size函数则是按照16位对齐之后的大小。
sizeof该运算符只是返回类型的大小,而非实际的内存。

问题

尝试在xcode中修改#pragma pack(16),好像没有生效。stackoverflow上有人指出可以这么设置内存对齐。

struct foo {   uint8_t bar;   uint8_t baz; } __attribute__((packed));

总结

主要讲了内存对齐的三个原则,以及介绍了三个函数的区别。

目录

  • 为什么要内存对齐
  • pragma pack
  • 对齐规则
  • 三个函数的分析
  • 总结

为什么要内存对齐?

其一,为了方便移植。
CPU是一块块的进行进行内存访问。有一些硬件平台不允许随机访问,只能访问对齐后的内存地址,否则会报异常。

很多 CPU(如基于 Alpha,IA-64,MIPS,和 SuperH 体系的)拒绝读取未对齐数据。当一个程序要求这些 CPU 读取未对齐数据时,这时 CPU 会进入异常处理状态并且通知程序不能继续执行。举个例子,在 ARM,MIPS,和 SH 硬件平台上,当操作系统被要求存取一个未对齐数据时会默认给应用程序抛出硬件异常。(https://www.jianshu.com/p/a371e2613ec8)

其二,为了提高CPU内存访问速度。
CPU访问非对齐的内存时需要进行多次拼接。如下图,比如需要读取从[2, 5]的内存,需要分别读取两次,然后还需要做位移的运算,最后才能得到需要的数据。这中间的损耗就会影响访问速度。
iOS的内存对齐

#pragma pack

宏命令#pragma pack会告诉编译器如何进行内存对齐。XCODE中默认为#pragma pack(8)。其接受的参数为:’1′, ‘2’, ‘4’, ‘8’, or ’16’。

对齐规则

  • 第一个成员在与结构体变量偏移量为0的位置处。
  • 其他成员变量要对齐到某数的整数倍的地址处。某数的取值为编译器默认的一个对齐数(#pragma pack(8))与该成员大小的较小者。
  • 最后总的大小为其最大成员的整数倍。如果成员中有结构体,那么这个成员的大小为该结构体内的最大成员的大小。

举例一,

 MyAnimal : NSObject{     // *isa 8字节     int _age; } MyAnimal   NSLog(@"class_getInstanceSize = %zu",class_getInstanceSize([myAnimal class])); NSLog(@"malloc_size = %lu",malloc_size(CFBridgingRetain(myAnimal))); NSLog(@"sizeof = %lu",sizeof(myAnimal));

这段代码的输出是:

class_getInstanceSize = 16 malloc_size = 16 sizeof = 8

这里你只需要关注class_getInstanceSize的大小,暂时不用管malloc_size,与sizeof的值。

举例二,

 MyAnimal : NSObject{     // *isa 8 (0-8)     int _age; // 4 (8-12)     char c0; // 1 (13)     char c1; // 1 (14) }  /* 括号内为内存位置,(0-8)表示放置在0,1,2,3...7的位置上。首先按照规则1,2计算出来内存大小为14,再按照规则3,按照8的倍数对齐,则得出16个字节的结果。  输出为: class_getInstanceSize = 16 malloc_size = 16 sizeof = 8 、 */

举例三,

 MyAnimal : NSObject{     // *isa 8 (0-8)     char c0; // 1 (8-9)     int _age; // 4 (12-16)     char c1; // 1 (17) }  /* 括号内为内存位置,(0-8)表示放置在0,1,2,3...7的位置上。首先按照规则1,2计算出来内存大小为17,再按照规则3,按照8的倍数对齐,则得出24个字节的结果。  输出为: class_getInstanceSize = 24 malloc_size = 32 sizeof = 8 、 */

三个函数

class_getInstanceSize函数表示按照#pragma pack该宏对齐内存之后的大小。
malloc_size函数则是按照16位对齐之后的大小。
sizeof该运算符只是返回类型的大小,而非实际的内存。

问题

尝试在xcode中修改#pragma pack(16),好像没有生效。stackoverflow上有人指出可以这么设置内存对齐。

struct foo {   uint8_t bar;   uint8_t baz; } __attribute__((packed));

总结

主要讲了内存对齐的三个原则,以及介绍了三个函数的区别。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » iOS的内存对齐求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们