Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C位域内存使用率_C_Struct_Bit Fields - Fatal编程技术网

C位域内存使用率

C位域内存使用率,c,struct,bit-fields,C,Struct,Bit Fields,我需要以以下形式处理一些数据: typedef struct{ unsigned n1 : 12; unsigned n2 : 12; unsigned n3 : 12; unsigned n4 : 1; unsigned n5 : 35; } data; 我确保它们总共计9个字节。 但他们没有。。将该结构的9个字节写入文件并读回不会恢复所有数据,sizeof(data)返回16。 这里有什么问题?问题是编译器出于效率原因添加了一些填充 此行为可以被覆

我需要以以下形式处理一些数据:

typedef struct{
    unsigned n1 : 12;
    unsigned n2 : 12;
    unsigned n3 : 12;
    unsigned n4 :  1;
    unsigned n5 : 35;
} data;
我确保它们总共计9个字节。
但他们没有。。将该结构的9个字节写入文件并读回不会恢复所有数据,
sizeof(data)
返回16。

这里有什么问题?

问题是编译器出于效率原因添加了一些填充

此行为可以被覆盖

有关如何使用gcc执行此操作,请参见


<如何使用VisualC++进行查看:

您的结构是9字节长。编译器将其填充到16个字节,以更方便缓存。这可以使用编译器特定的指令/关键字来关闭(我一般不建议这样做)。请参阅。

您可以使用特定于gcc的强制对齐:

typedef struct{
    unsigned n1 : 12;
    unsigned n2 : 12;
    unsigned n3 : 12;
    unsigned n4 :  1;
    unsigned n5 : 35;
} data __attribute__((__packed__));

阅读:

这在36位计算机上非常有效。你忘了告诉我们这是不是你得到的

在更常见的32位机器上,使用9字节对齐将很难实现。如果创建这些结构的数组,则需要不同的代码来访问地址模为0和地址模为9的对象中的字段

前三个字段的12位必须从不同的
无符号
s收集,并且根据地址的不同而有所不同


其他答案中的packing指令在这里不太可能起作用,除非您有位寻址(或36位CPU)的硬件。

Padding。无法保证编译器将如何分配这些位和/或在结构之后插入多少填充。编译器喜欢在均匀的边界上结束数据结构。构成均匀边界的因素取决于几个因素,其中最重要的因素是处理器体系结构。