如何计算给定字节对齐方式下计算结构体的大小

robert_cxj 2008-07-20 07:46:49
计算一个结构体在各种字节对齐方式下的占用空间大小,该如何判断,看msdn关于pragma的注释总是看不懂,例如以下两个例子:

struct tagA
{
char a;
short b;
char c;
};

假设四字节对齐,试问sizeof(tagA)为多少?
...全文
239 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyyapple 2008-07-21
  • 打赏
  • 举报
回复
struct tagA 
{
char a; //第一个成员自身长为1,#pragma pack(4),取小值1,所以放在[0]位置上
short b; //第二个成员自身为2,,#pragma pack(4),取小值2,按2字节对齐,所以放在[2,3]位置上
char c; //第三个成员自身长为1,#pragma pack(4),取小值1,所以放在[4]位置上
};
//这个结构实际占据的内存空间是5字节的对齐;按照内部最大的成员的长度,和#pragma pack规定的值之中较小的一个对齐的。
所以结构之间对齐的长度是min(sizeof(short),4),也就是2。 5按照2字节圆整的结果是6,所以sizeof(struct tagA)是6。


iBug168 2008-07-20
  • 打赏
  • 举报
回复
所以,如果没有特殊的要求....
结构体里面的成员...最好是从大到小排列,在理论上来说可以尽量减小空间浪费.

顺便再飘下....
chlaws 2008-07-20
  • 打赏
  • 举报
回复
sorry 没看到要求四字节对齐 丢人了
sitych 2008-07-20
  • 打赏
  • 举报
回复
在不同的操作系统最好先试一下,然后再编码
arong1234 2008-07-20
  • 打赏
  • 举报
回复
人家是四字节对齐,所以chlaws得不对。下面是对他说法得修改
[Quote=引用 1 楼 chlaws 的回复:]
C/C++ code
struct tagA
{
char a; //1个字节
short b; //因为四字节对齐,因此b从第4个字节开始,自己占2个字节,前面有三个不用得字节
char c; //1个自己,前面2个字节填充
};
因此总共4+4+1=9字节
如果你改成

struct tagA
{
char a;
char c;
short b;
};

就可以省很多字节,慢慢体会,别人教不会你得

[/Quote]
ChamPagneZ 2008-07-20
  • 打赏
  • 举报
回复

/*
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。
*/
chlaws 2008-07-20
  • 打赏
  • 举报
回复

struct tagA
{
char a; //1个字节,因为下一变量是short2个类型,so 要补齐1个字节
short b; //2个字节
char c; //1个自己
};

所以是5个字节,看这个,主要看最大数据类型,然后首字节要与最大数据类型字节进行对齐,因此余下的字节要进行补齐


69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧