Chinaunix首页 | 论坛 | 博客
  • 博客访问: 720597
  • 博文数量: 161
  • 博客积分: 2998
  • 博客等级: 少校
  • 技术积分: 1697
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-28 09:39
文章分类

全部博文(161)

文章存档

2012年(6)

2011年(120)

2010年(35)

分类: LINUX

2011-04-22 20:00:57

三原则:
1。每个成员按照自己的方式对齐,并能最小化长度
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理器组时可以保证每一项边界对齐。
每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(#pragma pack(n))中较小的一个对齐,即(min(n,sizeof(item))),并且结构的长度必须为所有用过的所有对齐参数的整数倍,不够就补空字节。
例如:
#pragma pack(8)
struct TestStruct4
{
    char a;
    long b;
};
struct TestStruct5
{
    char c;
    TestStruct4 d;
    long long e;
};
 
a对齐参数8,但默认1字节对齐,所以按1字节对齐。
b对齐参数8,但默认4字节对齐,所以按4字节对齐。
那么其布局是:(a)1XXX (X是B对于其的补空字节)
             (b)1111 (由于b是4,所以起始地址应该是4的倍数,所以a填充3个字节)
所以sizeof(TestStruct4)应该为8
TestStruct5 :
c对齐参数1,
d为8已经确定
e是8字节,对齐方式也是8
TestStruct5布局为:
 
c                d.a         d.b(结构为最长成员的对齐方式为4)            e(对齐为8)
1***, (对齐为4)1***,      1111 ,****                     (对齐为8,前面只有12,所以要为8的倍数必须为16,所以填充4字节)11111111                       
 
 
阅读(1471) | 评论(0) | 转发(0) |
0

上一篇:C语言关于0和/0区别

下一篇:左值右值

给主人留下些什么吧!~~