2010-06-18 100 views
0

在下面的一段代码,的sizeof(结构)混淆

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

如何预测结构的大小?

+5

为什么你认为你应该能够准确地预测它? – 2010-06-18 18:12:43

+0

你为什么想要? – 2010-06-18 18:22:09

回答

9

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

0

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

3

这取决于平台和编译器设置(包装,定位,32/64机)

根据comp.lang.c FAQ list

“位字段被认为是不可移植的,虽然他们都毫不逊色便携比语言的其他部分。“

+1

奇怪的引用是什么...... – jalf 2010-06-19 03:07:19

1

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

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

+0

我不确定编译器将这个结构占用小于int的大小是否合法。它肯定不能占用小于char的大小,因为sizeof(...)必须返回一个整数。 – Stewart 2010-06-18 18:22:12

+0

@Stewart:有'sizeof(int)== 2'的平台。 – 2010-06-18 18:29:19

+0

@Stephen:我不认为我说没有。也有平台,它不是八位数的倍数,我的答案中也没有任何东西不允许这样做。答案表明编译器可能只将结构打包为4位,这就是我所说的不可能发生的情况,特别是因为int必须至少为16位。 – Stewart 2010-06-18 18:44:16

3

一般来说是不可预测的,但实际上它会经常出现sizeof(int)。其本身往往是4;不常见2,有时8。

大多数情况下位字段将被打包,大多数情况下int类型将有9位或更多位的存储空间。

+1

int总是至少为16位,标准是这样说的(long总是至少为32,而在C99中我们得到的long long至少是64,并且它们都可以大于这些大小) – Spudd86 2010-06-19 01:01:35

0

添加位字段大小,除以8 * sizeof(int),并取该值的上限。在你的例子中,它会是4.

+0

没有底层逻辑无论如何... – SurDin 2010-06-18 22:53:15

+0

@SurDin假设是编译器将这些字段紧紧包装并使用sizeof(int)大小的块。 – Spudd86 2010-06-19 00:57:18