繁体   English   中英

为什么这个结构的大小是5,当它应该是4

[英]why size of this structure is 5 when it should be 4

我试图将一些数据打包到一个结构中。

结构定义如下:

#pragma pack(push)
#pragma pack(1)
struct Data
{
    unsigned char i:2;
    unsigned short r:14;
    unsigned short c:14;
};
#pragma pack(pop)

由于位数是30而pack是1,我的理解是这个结构的大小应该是4,但是编译器说它的大小是5个字节。

我正在使用Visual Studio 2012。

请注意,它们是位字段。

这个大小为4:

struct Data
{
    unsigned short i:2;
    unsigned short r:14;
    unsigned short c:14;
};

内存中位域的确切布局未由标准指定。 但是,我相信如果你对所有字段使用unsigned int ,就像这样:

struct Data
{
    unsigned int i:2;
    unsigned int r:14;
    unsigned int c:14;
};

您的数据将打包成一个30位整数值。 但是,由于您已将第一个字段声明为char,因此它不能保存14位值,因此被视为单独的字段。

(gcc为这两个变体提供了4个字节,这是我说编译器之间存在差异的一个原因 - 因此标准中没有说明标准中没有定义字段)

因为pack pragma控制成员的对齐。 当你说1 - 它意味着成员在字节限制时对齐,即成员可以从每个字节开始。 但是由于你有3个大小为1,2和2的成员,结果大小为5.如果不使用它,编译器通常使用比1更高的对齐,因为它对于cpu而言更有效地访问多个元素某些值(在您的情况下,因为它在删除包pragme时占用6个字节)。

Pack不是位级结构的打包。

编辑 :澄清此声明来自Visual Studio的包编译指示文档中的引用:

n(可选):指定要用于打包的值(以字节为单位)。 n的默认值为8.有效值为1,2,4,8和16.成员的对齐将位于边界上,该边界是n的倍数或成员大小的倍数,以较小者为准更小

编辑2 (从问题编辑后):第一种情况下的位域未合并(并显示上述行为)的原因是Visual Studio只将结构的位域成员合并为一个数据元素,当它们具有相同的dataype时。 因此,当所有都被宣告为短时,他会尝试合并它们(并且在这种情况下是成功的),但是当一个不同时他就无法合并。

我的理解是元素被打包成相同类型的组。 如果你将'char'替换为'short',它将使用以下':14'打包':2',因为16位适合'short'。

如果您有'char'后跟'short',则不会合并。

Bitfields无论如何都是奇怪的野兽:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM