关于C语言 含位域结构体的内存大小的疑问

结构体如下定义
typedef struct nack_sn {
unsigned short ncack_sn:10;
unsigned short e1:1;
unsigned short e2:1;
unsigned int start:15;
unsigned int end:15;
} nack_sn_t;
根据在vc和gcc下得到的结果都是大小为8,但是按照计算不是应该是 6 吗?根据规则:1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍; short和int类型的数据都没填满吧?请帮忙解惑,谢谢!

因为这里又涉及到了结构体内存对齐的知识,对于VC和GCC下面的对齐模数都是4

存放完short类型的数据后,后面还有2个字节没有使用,内存分布大约是这样的

[ncack_sn:10][e1:1][e2:1][填充:20]

[start:15][end:15][填充:2]

总共占8个字节

typedef struct nack_sn {

    unsigned short ncack_sn:10;

    unsigned short e1:1;       

    unsigned short e2:1;       

    unsigned int start:15;

    unsigned int end:15; 

} nack_sn_t;

追问

unsigned short类型的为什么要填充20 ,不是填4就行了吗? 20是直接在三个连续字段的后面填充吗?

我是根据规则1计算unsigned short的字节数的,具体如下:
unsigned short :10+1+1=12<16 填充4,
unsigned int : 15+15 =30<32 填充 2,
16+32=48/8=6

追答

你这是位域算出来的纯理论值,结构体是需要内存对齐的,你去看一下 关于 位域的内存对齐吧。。你就会明白为什么是8了

追问

我看了下资料。对齐模数4 ,那应该这样理解:10+2填充(ncack_sn) + 1+3填充(e1) =16 ; 1+15填充(e2)所以得到的4个字节吧 后面再加4个字节就是8了 , 是吧

追答

short类型的三个位刚好一字节,所以是连续的

温馨提示:答案为网友推荐,仅供参考
相似回答