从计算结构变量字节大小的问题开始
问题:
typedef struct
{
int A
char B
}T_s;
请问T_s的长度为几个字节?
答案:
pc上的32位编译器一般缺省是4位对齐,所以长度会是8,此时在B后填充3字节,但对齐方式可以改的;
而有些嵌入系统的编译器缺省是不对齐的,所以长度为5。
比如在vc中,
如果
#pragma pack(4) //缺省
则sizeof(T_s)等于8
如果
#pragma pack
则sizeof(T_s)等于5
而且和cpu有关,在有的机器上int不一定就是32位
1对齐:5;2对齐:6;4对齐:8;8对齐:8;16对齐:8
看一个例子:
将A写入二进制文件
#pragma pack (1)
struct A
{
char a;
int b;
};
文件
61 06 00 00 00#pragma pack (2)
struct A
{
char a;
int b;
};
文件
61 CC 06 00 00 00#pragma pack (4)
struct A
{
char a;
int b;
};
文件
61 CC CC CC 06 00 00 00#pragma pack (4)
struct A
{
char a;
int b;
};
文件
61 CC CC CC 06 00 00 00#pragma pack (8)
struct A
{
char a;
int b;
};
文件
61 CC CC CC 06 00 00 00该例子作者得出的结论:
结论是 实际的对齐长度 = [pack指定的对齐长度]和[struct中最长成员的长度]较小的一个。
本文探讨了在32位编译系统中结构体的字节对齐与填充问题,介绍了不同编译器及对齐选项下结构体变量的实际长度,并通过实例展示了不同对齐设置对结构体成员布局的影响。
4229

被折叠的 条评论
为什么被折叠?



