代码之家  ›  专栏  ›  技术社区  ›  Sadique

结构混乱

c c++
  •  0
  • Sadique  · 技术社区  · 14 年前

    在下面的代码中,

    #include<stdio.h>
    typedef struct {
        int bit1:1;
        int bit3:4;
        int bit4:4;
    } node;
    
    int main(){
        node n,n1,n2,ff[10];
    
        printf("%d\n",sizeof(node));
        return 0;
    }
    

    如何预测结构的大小?

    6 回复  |  直到 14 年前
        1
  •  9
  •   Johannes Schaub - litb    14 年前

    如果不知道编译器及其编译的目标平台,就无法预测它。

        2
  •  3
  •   stacker    14 年前

    它取决于平台和编译器设置(打包、对齐、32/64机器)

    根据 comp.lang.c FAQ list

    位字段被认为是不可移植的,尽管它们与语言的其他部分相比不可移植。

        3
  •  3
  •   George Phillips    14 年前

    一般来说是不可预测的,但实际上,它的sizeof(int)出现的频率要比不出现的频率高。它本身经常是4个;不太常见的是2个,有时肯定是8个。

    大多数时候位字段将被打包,大部分时候int类型将有9个或更多的存储位。

        4
  •  1
  •   Mike    14 年前

    您将发现结构的大小根据编译器优化设置而变化。我可以为这个结构预测2到12个字节之间的任何地方。

    即使像您这样使用位字段,也不能总是预测结构的大小。编译器可能会让每个位字段占用整型的空间,或者只占用您指定的1或4位。使用位字段,虽然它在内存存储空间上很好,但对于运行时间和可执行文件大小通常是不利的。

        5
  •  0
  •   Jack    14 年前

    通常每个编译器都决定如何打包联合,这样就不能对最终大小做很多假设。他们可以根据其参数决定不同的布局。

        6
  •  0
  •   John    14 年前

    添加位字段大小,除以8*sizeof(int),取该值的上限。在您的示例中,它将是4。