使用C类中的位字段的错误配置属性

我正在尝试使用C中的位字段来实现特定的类大小,但由于某种原因它比我预期的要大.

问题是,一个32位(4字节)的类报告(当作为参数传递给sizeof时)5个字节.下面的示例类:

typedef unsigned char u8;
typedef unsigned int u32;

class Test {
    u8 four_bit_field : 4;
    u8 eight_bit_field;
    u32 twenty_bit_field : 20;
}__attribute__((packed));

如果切换了four_bit_field和eight_bit_field位置,则sizeof返回适当的大小,4个字节.我相信它可能是一个内存排列问题.

那么,有人知道这种行为背后的原因吗?而且,最重要的是,如何在不切换任何位置的情况下解决这个问题.

解决方法

没有位计数的u8字段与下一个字节边界对齐,而不是与其他位字段打包在一起.因此,前4位占用一个字节,后8位取一个字节,最后20位取3个字节,总共5位.

如果向8位字段添加位字段大小,它将起作用,请参见http://ideone.com/Bexw6l

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...