C的struct内存对齐的问题

采用VC6的的编译器
对于struct:
struct ST_DAT1
    {
        char cDatA;
        int nDatC;
        char cDatB;
    } stDblChr;
struct ST_DAT2
    {
        char cDatA;
        char cDatB;
        int nDatC;
    } stDblChr;
很显然,编译器在编译的时候,要做内存对齐的调整。由于两个struct中最长的变量都是int,占据了4个字节的内存空间,因此都会提升至int型。
对ST_DAT1,cDatA紧接着是int型的nDatC,因此cDatA会自动提升成int。其实这个地方是由于分配了cDatA之后,剩下的内存空间只有3个字节,不足以放下一个int型,要存储nDatC的时候,nDatC只有另起炉灶,放到一个新的4字节空间里面,因为cDatA自动提升成了int。最后的cDatB,其后面没有东西了,也会自动提升成int型。因此ST_DAT1占据了12个字节(用sizeof检查)
对ST_DAT2,cDatA,和cDatB两个写得相连,编译器,碰到cDatA,先分配一个字节给他,再碰到cDatB,由于和cDatA的数据宽度一样,因此不会做提升,同意分配一个字节他,此时总共分配了两个字节。等编译器碰到nDatC,由于数据位宽不一样,就要做自动提升了,和前面的道理一样。因此这个时候sizeof检查ST_DAT2占据了8个字节。

posted on 2009-08-25 10:44  vincenzo.lai  阅读(1331)  评论(0)    收藏  举报

导航