字节对齐

chfguo 2006-09-07 03:03:09
我想请教关于字节对齐的问题。我在网上找到如下的资料:
字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。例如上面第一个结构体变量。


程序如下:


#include <stdio.h>
#pragma pack(4)//按4字节对齐
typedef struct T1_Tag
{
char x1;
short x2;
double x3;
char x4;

} T1;

int main()
{
T1 t1;
printf("sizeof(T1)=%d\n",sizeof(t1));
}
结果是16,这我不明白。我认为下x1占4B,x2占4B,x3占8B,x4占4B才对啊。
如果我按2字节对齐,
#include <stdio.h>
#pragma pack(2)
typedef struct T1_Tag
{
char x1;
short x2;
double x3;
char x4;

} T1;

int main()
{
T1 t1;
printf("sizeof(T1)=%d\n",sizeof(t1));
}
结果就成了14,按上述原则,结构体的总大小为结构体最宽基本类型成员大小的整数倍,最宽是double,应该是8的整数倍啊。我真的不明白,望指教!!!!
...全文
353 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lnhsgj 2006-09-09
  • 打赏
  • 举报
回复
声明:C语言,已经好多年没整了,基本上忘得差不多了。
你的方法和语句是否正确已经看不清楚了。

提议,变通一下:
x1-x4全部定义为double
在赋值前,先将数据类型转换为double
在提取数据时,再将其转换回来

这样做的好处:
4个数据类型相同、位数相同。用不着为数据位对齐费脑筋。
也用不着“计算位数”及“添充空位”的操作。
类型转换,实现方法简单、速度快,尤其是在大量数据处理时表现更明显。
这样做其实并未改变数据包的容量和结构。



chfguo 2006-09-08
  • 打赏
  • 举报
回复
我在[开发语言]中提了,可没人回啊,我是第一次使用论坛,我不是很清楚如何用,哎,都没人帮解决问题
lnhsgj 2006-09-07
  • 打赏
  • 举报
回复
哈哈,C语言,到“语言”那里去提问呀

3,837

社区成员

发帖
与我相关
我的任务
社区描述
硬件使用 交换及路由技术相关问题讨论专区
社区管理员
  • 交换及路由技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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