Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117873
  • 博文数量: 30
  • 博客积分: 2520
  • 博客等级: 少校
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 10:31
文章分类
文章存档

2009年(7)

2008年(23)

我的朋友

分类: LINUX

2008-03-28 00:06:40

#include
struct A
{
double l;
int i;
int b;
char c;
};
int main()
{
        struct A m[2];
        printf("%d\n", sizeof(struct A));
        printf("%p\n", &m[0]);
        printf("%p\n", &m[1]);
        printf("%d\n", (int)&m[1]-(int)&m[0]);
        printf("%p\n", &(m[0].l));
        printf("%p\n", &(m[1].l));
        return 0;
}
对于上面的代码, 在VC中,结构体A的大小为24, 但是在gcc 中其大小却为20, 这样, 我连续分配两个这个结构体时, 第二个结构体的起始就不是double大小的倍数
 
#include
struct A
{
double l;
int i;
int b;
char c;
};
int main()
{
        struct A m[2];
        printf("%d\n", sizeof(struct A));
        pri ...
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。在lz的程序中,n默认是4。
在这个前提下分析lz得到的结果:
4字节对齐(#pragma pack(4))
sizeof(m[0]) = 20;
分析过程:
1)成员数据对齐
struct A {
  double l;        /* 长度8 > 4 按4对齐;起始offset=0 0%4=0;存放位置区间[0,7] */
  int i;            /* 长度4 = 4 按4对齐;起始offset=8 8%4=0;存放位置区间[8,11] */
  int b;           /* 长度4 = 4 按4对齐;起始offset=12 12%4=0;存放位置区间[12,15] */
  char c;         /* 长度 1 = 4 按1对齐;起始offset=16 16%1=0;存放位置区间[16] */
};
成员总大小为17,
整体对齐系数=min(max (double, int, char), 4) = 4;
整个结构体的大小=20,为什么不是上面算出来的17呢?这里涉及到一个叫做“圆整”的概念。
什么叫“圆整”?比如在这个例子,从17开始,看看那个位置可以被“整体对齐系数(4)”整除,17,18,19都不合适,所以到20,圆整结束。
这也解释了为什么第二个结构体开始的位置不能被8整除,其实只要个能被4整除就可以了。
阅读(1080) | 评论(0) | 转发(0) |
0

上一篇:HTTP协议

下一篇:fread和send的返回值

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