1

好吧,我创建了一个位字段

typedef struct 
{
    unsigned bit : 1;
}BIT;

并且 sizeof 运算符返回 4...ergo 说 struct 并不是真的有点,而是 32。有没有办法强制 ac struct 低于所述值?这一切都依赖于系统吗?(我的书说一个字符只有 1 个字节,而对我来说 sizeof(char) 返回 4...)

4

5 回答 5

3

N1570

6.7.2.1 结构和联合说明符
...
11 实现可以分配任何大到足以容纳位域的可寻址存储单元。如果有足够的空间剩余,紧跟在结构中另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则将不适合的位域放入下一个单元还是与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。

您的实现显然分配了一个 32 位unsigned int来包含位字段。检查您的编译器文档,看看是否有办法强制它为位域使用较小的类型,尽管我不会屏住呼吸。

于 2013-10-02T15:58:08.533 回答
1

您可以尝试使用unsigned charshort用于结构,但也存在对齐问题。

于 2013-10-02T15:45:14.520 回答
1

sizeof(char)以退货标准保证1

对于您的BIT结构:无法定义需要少于 1 字节内存的数据类型。

对于位域(:说明符),如果你真的真的必须以所有可能的方式节省一些内存,你可能很幸运能做这样的事情:

typedef struct 
{
    char c1 : 4;
    char c2 : 4;
} MyPackedByte;

这将允许您在单个字节中存储两个 4 位值,但是这种行为可能是编译器特定的,也许您将不得不使用一些预处理器指令,例如#pragma pack

参见:#pragma pack 效果

于 2013-10-02T15:56:59.350 回答
0

如果只需要 1 位,为什么还要有结构?最小的存储单位是一个字节(通常是 1 个字符);为什么不 typedef BIT 是一个字符?

于 2013-10-02T15:46:21.853 回答
0

您不应该对位域使用 sizeof() 函数。你是你如何“切割”你的 int 的一个设置,如果你以后真的需要获取它的大小,也许你可以将它存储在某个地方?类似 typedef struct { ``unsigned bit : 1, bit2 : 3;

``size_t size_bit1, size_bit2; }少量;

无效的 initBIT() {
size_bit1 = 1; size_bit2 = 3; }

于 2013-10-02T22:53:02.727 回答