gpt4 book ai didi

编译器向已对齐的 union 位字段成员添加填充

转载 作者:太空宇宙 更新时间:2023-11-04 03:40:17 26 4
gpt4 key购买 nike

我正在尝试构建自己的库,用于在不同字节序的整数和带符号的表示形式之间进行转换。这部分涉及直接访问 char 缓冲区作为相同大小的整数(主要用于快速比较)。我非常关心这个项目的可移植性。  我希望这个库可以在所有机器和新旧 c 编译器上使用,而不仅仅是 linux 上的 gcc 或 clang。

最初我为整数成员使用了 c99 固定宽度整数类型。  这工作正常。  当我从固定宽度整数切换到相同大小的位字段时,问题就开始了。我这样做是为了通过不依赖于 c99 功能来提高可移植性。 

问题是当我使用位字段时,gcc 提示填充已被插入(-Werror 和 -Wpadded 被传递给 gcc):
错误:将结构大小填充到对齐边界

这是其中一个 union 的示例:

旧版本,工作正常:

typedef union
{
unsigned char bytes[4];
uint32_t uvalue;
} upicl_uint32_be;

新版本,添加了不需要的填充:

typedef union
{
unsigned char bytes[4];
unsigned long uvalue : 32;
} upicl_uint32_be;


我不知道为什么在 32 位位字段已经对齐时向我的 union 添加填充。

有更好的方法吗?

最佳答案

long 可能是 8 个字节长,因此位域将占用 8 个字节,因为它与 uint32_t 的大小不同。

union 类型的名称表明您希望位域基于 uint32_t 而不是 unsigned long(或者您假设两者相同,这显然是不正确的)。

关于编译器向已对齐的 union 位字段成员添加填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29242603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com