结构/类位域打包

问题描述 投票:0回答:1

我想使用C++的位域功能。 然而我遇到了各种奇怪的行为,我想知道是否有 一种约束编译器的方法。

我想使用这个位字段:

class MyBitField
{
   uint32 a :  8;
   uint32 b : 32;
   uint32 c : 32;
}

现在使用此代码:

uint8 rawData[9] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xFF, 0xFF};
MyBitField *pMyBitField = (MyBitField*)rawData;

我期望(在小端 32 位 CPU 上):
pMyBitField 的 a 字段为 0x12,
pMyBitField 的 b 字段为 0x9A785634,
pMyBitField 的 a 字段为 0xFFFFDEBC。

编译器选择进行一些无法解释的对齐。 我知道,如果您在位字段中使用不同的类型,您可能会对齐,但事实并非如此。 我该怎么办?

让我们关注 Visual Studio 2005,但任何其他环境支持也将受到祝福。

*我读了一些包装帖子,但它并没有改变对齐问题。

c++ bit-manipulation
1个回答
2
投票

我希望你的代码无法编译。

rawData
具有数组类型;这 隐式转换为指针,但不能转换为类 类型,隐式或显式。

剩下的,编译器如何布局位域就是实现 已定义,但就您而言,我希望它是无关紧要的;在 32 位上 机器,32 位位域通常会强制编译器使用 下一个字,因此只有第一位字段有效。 取决于 编译器,它会导致编译器将值放在高位 排序 8 位,或低 8 位(并保留字的其余部分 未定义)。

如果需要匹配外部格式,唯一的方法是 可靠地是逐字节插入,插入所需的任何值 字节。

© www.soinside.com 2019 - 2024. All rights reserved.