结构体对齐详解
时间:2010-06-09 来源:lanlovehua
#include<stdio.h> 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整除就可以了。 |
相关阅读 更多 +