iOS中的字节对齐
字节对齐的原则:Struct的字节对齐
- 数据成员对?规则:结构(struct)(或联合(union))的数据成员,第
一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要
从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,
结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存
储。- 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从
其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b
里有char,int ,double等元素,那b应该从8的整数倍开始存储.)- 收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大
成员的整数倍.不足的要补?。
struct的顺序存放有一定的规则
-
- struct在内存中是连续存放的,利用这点可以对struct进行强制转化(只要定义相同即可)。
-
- struct定义的结构体在内存中是连续存放的。所以,数组结构可以与结构体互相转化。只需要强制转化一下即可。但是要注意struct结构体字节对其的问题,注意不同数据类型的定义先后。
struct LGStruct1 {
char a;
// size:1 , offset:0 , 0 ~ 01(8的倍数补齐,8)
double b;
// size:8 , offset:8 , 8 ~ 1516
int c;
// size:4 , offset:16 , 16 ~ 1920
short d;
// size:2 , offset:20 , 20 ~ 2122(8的倍数补齐,24)
} MyStruct1;
char *a = (void *)&MyStruct1;
double *b = (void *)&MyStruct1.b;
int *c = (void *)&MyStruct1.c;
short *d = (void *)&MyStruct1.d;
/*
查看内存情况(iOS 小端存储)
(lldb) po sizeof(MyStruct1)
24
(lldb) x &MyStruct1
0x100002538: 61 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 3fa..............?
0x100002548: 02 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00................
(lldb) p &MyStuct1
error: use of undeclared identifier 'MyStuct1'
(lldb) p &MyStruct1
(LGStruct1 *) $1 = 0x0000000100002538
(lldb) p a
(char *) $2 = 0x0000000100002538 "a"
(lldb) p b
(double *) $3 = 0x0000000100002540
(lldb) p c
(int *) $4 = 0x0000000100002548
(lldb) p d
(short *) $5 = 0x000000010000254c
*/
上面的案例很好理解 来个特殊极端的案例2:
struct LGStruct2 {
double b;
// size:8 , offset:0 , 0 ~ 78
char a;
// size:1 , offset:8 , 8 ~ 89(8的倍数补齐,8)
int c;
// size:4 , offset:12 , 12 ~ 1520
short d;
// size:2 , offset:16 , 16 ~ 1722(8的倍数补齐,24)
} MyStruct2;
struct LGStruct3 {
double b;
// size:8 , offset:0 , 0 ~ 78
int c;
// size:4 , offset:11 , 8 ~ 1112
char a;
// size:1 , offset:12 , 12 ~ 1213
short d;
// size:2 , offset:14 , 14 ~ 1516
} MyStruct3;
(lldb) p sizeof(MyStruct2)
(unsigned long) $6 = 24
(lldb) p sizeof(MyStruct3)
(unsigned long) $0 = 16
MyStruct3 中的a和d的内存分布有点奇怪。
总结一下: 【iOS中的字节对齐】1、第一个参数 从offset 0位置开始
2、第二个参数开始,以当前参数sizeof的倍数补齐
3、最后 以8的倍数补齐
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 2020-04-07vue中Axios的封装和API接口的管理
- Android中的AES加密-下
- 放下心中的偶像包袱吧
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗