【发布时间】:2018-08-21 06:58:34
【问题描述】:
我在定义 6-bit 字段并将其假定为 8-bit 时遇到了 #pragma pack(1) 错误行为。我阅读了this question 来解决我的问题,但它对我没有任何帮助。
在 Visual Studio 2012 我定义了下面的 struct 用于保存 Base64 字符:
#pragma pack(1)
struct BASE64 {
CHAR cChar1 : 6;
CHAR cChar2 : 6;
CHAR cChar3 : 6;
CHAR cChar4 : 6;
};
现在我用sizeof 得到了它的大小,但结果不是我所期望的:
printf("%d", sizeof(BASE64)); // should print 3
结果:4
我期望得到3(因为6 * 4 = 24,所以24位是3字节)
我用1-bit 字段测试它并得到正确的大小(1 字节):
#pragma pack(1)
struct BASE64 {
CHAR cChar1 : 2;
CHAR cChar2 : 2;
CHAR cChar3 : 2;
CHAR cChar4 : 2;
};
实际上,为什么6-bit 假设8-bit 和#pragma pack(1)?
【问题讨论】:
-
在位域方面没有“正确的行为”,因为标准对它们的规定太差了。并且以 1 字节对齐方式打包意味着 8 位,是吗?没有#pragma pack(0.6)。此外,在使用 VS 时询问符合行为是无稽之谈。
-
我想编译器不想打扰所有这些位移和东西。如果你想打包使用 Ada.*
-
3 字节的布局需要将
cChar2(和cChar3)放在 2 字节上,与 @987654342 相比,它们需要更复杂的操作(2 字节访问 + 移位和屏蔽)来访问@(或cChar4)(1 字节访问 + 更简单的移位和屏蔽)。我怀疑 MS 根本不想实现更多以前的类型,而是与下一个字节边界对齐。 -
@user694733 我在
structs之前在Qt中这样定义,没有任何问题。我预计它会在visual studio中表现出相同的行为 -
@IInspectable 对他们有好处!这个问题被标记为 C,据我所知,VS2017 还不是 28 年前发布的 ISO 9899:1990 的合规实现。值得注意的是,从那时起,C 标准已经更改了 3 次(如果将 C95 算作主要更新,则更改了 4 次)。
标签: c winapi struct pragma-pack