解析C语言中结构体struct的对齐问题
首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 通过上面的分析,对结构体进行字节对齐,我们需要知道四个值:
及两个规则: 1.对齐规则: 2.填充规则: padLen = getPadLen(offset,defaultLen); int getPadLen(int offsetLen,int defaultLen) { int vaildLen = min(packLen,defaultLen); if(0 == vaildLen || 0 == offsetLen % vaildLen) { return 0; } return vaildLen - (offsetLen % vaildLen); } 结构体对齐算法思想:深度优先填充 先对齐内层结构体; 再遍历每个数据成员时计算;
struct{ short a; short b; short c; }A; sizeof(A) = 6; (vc6与gcc相同) struct{ long a; short c; }A; sizeof(A) = 8; (vc6与gcc相同),它的内存分配为: a1 a2 a3 a4,c1 c2 x x(a1为a的第一个字节,x为补齐字节,下同) struct{ int a; char b; short c; }A; sizeof(A) = 8; A的内存分配为: a1 a2 a3 a4,b1 x c1 c2 struct{ char a; int b; short c; }A1; sizeof(A1) = 12; (vc6与gcc相同) A1的内存分配为: a1 x x x,b1 b2 b3 b4,c1 c2 x x 下面是更复杂的情况,结构体作为成员 struct{ int a; doubl b; short c; }A; // sizeof(A) = 24 (vc6与gcc相同) struct{ char a,b; int c; double d; short e; struct A h; }B; sizeof(B) = 48 //(vc6与gcc相同) A的内存分布: a1 a2 a3 a4 x x x x,b1 b2 b3 b4 b5 b6 b7 b7,c1 c2 x x x x x x B的内存分布: a1 b1 x x,c1 c2 c3 c4,d1 d2 d3 d4 d5 d6 d7 d8,e1 e2 x x x x (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |