/*
不能只计算大小,关键也得知道怎么排列的,关系到按字节取值
结构体每个成员相对于结构体首地址的偏移量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大小
*/
字节对齐
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...