C++ sizeof(结构)混乱

C++ sizeof(结构)混乱,c++,c,C++,C,在下面的代码中 #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; } 如何预测结构的大小?如果不知道编译器及其编译目标平台,就无法预测结构的大小 通常每个编译器都会决定如何打包联合体

在下面的代码中

#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;
}

如何预测结构的大小?

如果不知道编译器及其编译目标平台,就无法预测结构的大小

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

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


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

您会发现结构的大小会根据编译器优化设置而变化。我预测这个结构的大小在2到12字节之间


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

通常不可预测,但实际上,它的大小往往会更大。它本身通常是4;不太常见的是2次,有时肯定是8次


大多数情况下,位字段将被压缩,大多数情况下,int类型将有9位或更多的存储。

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

为什么您认为您应该能够准确地预测它?我不确定编译器让此结构占用小于int的大小是否合法。它当然不能占用小于char的大小,因为sizeof。。。必须返回一个整数。@Stewart:有些平台的sizeofint==2。@Stephen:我想我没有说过没有。还有一些平台不是8位的倍数,我的回答中也没有什么不允许。答案表明编译器可能只将结构压缩为4位,这是我所说的不可能发生的,特别是当int必须至少为16位时。@Stewart,不,他说在某些情况下,每个位字段可能占用的空间与声明的空间一样小。这是真的,尽管这个示例声明了总共9位,但是很可能任何现代平台也会有一些填充位,以使整个内容适合整数个字符。在普通平台上,2是一个合理的大小,但4更可能。12当然是可能的,因为有3个声明的字段和一个愚蠢的?速度优化可以将每个都分配给它自己的32位int。假设您限制为具有8位字节的平台,则最小值可能是2字节。。有一些是9位字节的,但我不知道是否有人还在使用它们,或者是否存在用于它们的C编译器。。。在这种情况下,它可能是1字节。原因是,如果你声明了这些元素的数组,那么单个元素必须是可寻址的,我认为从来没有一种体系结构可以寻址任何小于平台字节的内容。@SurDin假设编译器将字段紧密打包并使用大小块int总是至少是16位,标准上说,所以long总是至少是32位,而在C99中,我们得到的long-long至少是64位,它们都可以大于这些大小