非字节对齐类型的字节对齐规则
我们可以使用“__packed”、“__attribute__((packed))”、“#pragma”等方式控制结构体的字节对齐,这些结构体的内部结构在定义时就已经确定了,当它们被包含在其它结构体内部时它们被当做一个整体来看待,其内部结构不受外面字节对齐控制方式的影响,但它们的对齐方式却受外面结构体的对齐方式控制,来看下面的例子:
#pragmapack(2)
typedef struct example26_1
{
char a;
int b;
char c;
}EXAMPLE26_1;
#pragma pack(1)
typedef struct example26_2
{
char a;
EXAMPLE26_1 b;
int c;
}EXAMPLE26_2;
#pragma pack()
typedef struct example26_3
{
char a;
EXAMPLE26_1 b;
int c;
}EXAMPLE26_3;
EXAMPLE26_1的内存分布示意图如下:
a
b
b
b
b
c
EXAMPLE26_1的数据如下:
sizeof(EXAMPLE26_1)
8
OFFSET(EXAMPLE26_1, a)
0
OFFSET(EXAMPLE26_1, b)
2
OFFSET(EXAMPLE26_1, c)
6
EXAMPLE26_1结构体按照2字节对齐,这个没什么好说的了,前面已经介绍过。
EXAMPLE26_2结构体按照1字节对齐,它里面的a、b、c都按照1字节对齐。其中b是一个按照2字节对齐的EXAMPLE26_1结构体,内部有2个填充的1字节,当b出现在要求1字节对齐的EXAMPLE26_2结构体中,b需要按照1字节对齐,注意,但其内部结构不能发生变化,那2个填充的1字节仍保留。
来看内存分布示意图:
a
b.a
b.b
b.b
b.b
b.b
b.c
c
c
c
c
EXAMPLE26_2的数据如下:
sizeof(EXAMPLE26_2)
13
OFFSET(EXAMPLE26_2, a)
0
OFFSET(EXAMPLE26_2, b.a)
1
OFFSET(EXAMPLE26_2, b.b)
3
OFFSET(EXAM