为什么打包的struct的大小是5个字节而不是4个字节?

普里莫兹·克拉里(PrimožKralj)

参见在线示例:Ideone示例

struct {
  union {
    struct {
      uint32_t messageID : 26;
      uint8_t priority : 3; 
    } __attribute__ ((packed));
    uint32_t rawID : 29;
  } __attribute__ ((packed));
  uint8_t canFlags : 3;
} __attribute__ ((packed)) idSpecial;

为什么编译器将结构的大小报告为5个字节而不是4个字节?它应该包含32位。

TJ人群

这是因为内存对齐:编译器不会canFlags字节中间开始,而是在下一个字节的开始(可能*)开始。因此,您有四个字节用于您的初始联合,一个字节用于canFlags

例如,如果您移入canFlags联合,则(可能*)大小为4:

typedef struct structTag {
  union {
    struct {
      uint32_t messageID : 26; /* 26bit message id, 67108864 ids */
      uint8_t priority : 3; /* priority: MUST BE 0 */
    } __attribute__ ((packed));
    uint32_t rawID : 29;
    uint8_t canFlags : 3; /* <==== Moved */
  } __attribute__ ((packed));
} __attribute__ ((packed)) idSpecial;

更新了有关ideone的示例显然,特定的更改可能不是您想要的。我只是在说明问题是在字节边界上开始一个新字段。


*“可能”,因为最终取决于编译器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么ObjectOutputStream用DataOutputStream写入14个字节而不是8个字节?

为什么lambda的大小为1个字节?

为什么arr [0]的大小是8个字节?

为什么2 2 3的大小为36个字节,而2 3 3的大小仅为24个字节?

为什么带有 %hu% 的 printf 从堆栈中取 4 个字节而不是 2 个?

为什么两个指针之间有16个字节的差异而不是8个字节?

memset按字节而不是整数(4个字节)

为什么数据类型“字节”的大小是一个字节?

为什么堆栈帧中局部变量数组的每个插槽都是4个字节,而不是JVM中的1个字节?

将4个字节的整数打包为bytearray或array

Java 2个字节的字符大小不是吗?

为什么数字2使用1个字节而不是2个空格?

为什么 char* 需要 4 个字节而不是 1 个字节

为什么 QList 对象的大小是 4 个字节?

使用struct将4个字节转换为整数

为什么read()输出一个字节而不是一个字符串?

用wget下载的图像大小为4个字节

为什么在64位Linux上Option <f64>的大小为16个字节?

为什么32位.NET进程的引用类型的最小大小为12个字节

为什么在C语言的4个字节上出现一个char字符

为什么 sizeof() 不打印 16 个字节而不是 8 个?

为什么对dns标签施加63个字节的限制?

为什么KeyValuePair <int,long> 16个字节?

为什么SHL在8086中“移动” 2个字节?

为什么/ bin / true为27168个字节?

为什么FileInputReader.read()一次只能读取5个字节(Java)?

为什么此ZipArchive oracle关闭5-10个字节?

为什么qsort恰好需要4个字节来对字符串文字进行排序?

为什么gdb告诉我x86-64上的指针是4个字节?