/*
不能只计算大小,关键也得知道怎么排列的,关系到按字节取值
结构体每个成员相对于结构体首地址的偏移量offset都是这个成员大小的整数倍
每个成员按其类型的对齐参数和指定参数中较小的一个对齐
结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值
对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐
可以指定对齐值
iOS目前环境下用sizeof取值得到:
long long 8
long 8
int 4
short 2
Byte 1
*/
/*
struct ex
第一个成员i offset为0 是int 4字节的整数倍
第二个成员t offset为4 是char 1字节的整数倍
第三个成员n 未填充字节前 offset为5 不符合对齐,所以t后面会补3个字节
sizeof的大小是 4 + 1 + 补3 + 4 = 12
*/
typedef struct ex {
int i;
char t;
int n;
}ex;
#pragma pack(1)
typedef struct ex1 {
int i;
char t;
int n;
char add;
}ex1; //4 + 1 + 补3 + 4 + 1 +补3 = 16
#pragma pack() //按一个字节对齐就是 10 了
typedef struct ex2 {
int i;
short t;
short n;
}ex2; //4 + 2 + 2 = 8
typedef struct ex3 {
int i;
short t;
}ex3; //4 + 2 + 补2 = 8
typedef struct ex4
{
char c;
int msTimeStamp;
} ex4; //1 + 补3 + 4 = 8
typedef struct ex5
{
char c;
long msTimeStamp;
} ex5; //1 + 补7 + 8 = 16
typedef struct ex6
{
char c;
long msTimeStamp;
} ex6; //1 + 补7 + 8 = 16
typedef struct ex7
{
char c;
char c1;
char c2;
int i;
long msTimeStamp;
} ex7; //1 + 1 + 1 + 补1 + 4 (够8个了) + 8 = 16
typedef struct ex8
{
char c;
char c1;
char c2;
int i;
long msTimeStamp;
} ex8; //1 + 1 + 1 + 补1 + 4 (够8个了) + 8 = 16
//指定一个字节对齐
#pragma pack(1)
typedef struct ex9
{
char c;
char c1;
char c2;
int i;
long msTimeStamp; //15
} ex9;
#pragma pack()
typedef struct ex10
{
char c;
char c1;
char c2;
int i;
long msTimeStamp;
int j;
} ex10; //24 对比ex8 加了一个int 后 按最长的对齐了 加了一个8
//注意合理分配结构大小,控制所占内存的大小
typedef struct s1
{
int a;
short b;
short c;
} s1; //4 + 2 + 2 = 8
typedef struct s2
{
short b;
int a;
short c;
} s2; //2 + 补 2 + 4 + 2 + 补2 = 12
/*
把结构体赋值后,转成data 测测data大小
*/
字节对齐
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 4.3:新增class的相关内容 今天看到一个题目: 最开始简单的理解为,每个数据的size之和就是偏移量。因为偏...