C++ 结构/类位字段打包
我想使用cpp的位字段功能。C++ 结构/类位字段打包,c++,c,bit-manipulation,C++,C,Bit Manipulation,我想使用cpp的位字段功能。 然而,我有各种各样奇怪的行为,我想知道是否有 一种约束编译器的方法。 我想使用此位字段: 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 = (My
然而,我有各种各样奇怪的行为,我想知道是否有
一种约束编译器的方法。
我想使用此位字段:
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位处理器上):pMyBitField的a字段为0x12,
pMyBitField的b字段为0x9A785634,
pMyBitField的a字段为0xFFFFDEBC。
编译器选择进行一些无法解释的对齐。
我知道,如果在位字段中使用不同的类型,可能会得到对齐,但事实并非如此。
我该怎么做?
让我们关注VisualStudio2005,但任何其他环境支持也将受到祝福。
*我读了一些关于包装的帖子,但没有改变对齐问题。
谢谢
我希望您的代码不会编译
rawData
具有数组类型;这
隐式转换为指针,但不能转换为类
类型,隐式或显式
对于其余部分,编译器如何布局位字段是实现的关键
定义,但在你的情况下,我希望它是无关的;在32位上
在机器上,32位位字段通常会强制编译器使用
下一个字,所以只有第一个位字段有任何效果。取决于
编译器,它将导致编译器将值放在高
顺序为8位,或低位为8位(保留字的其余部分
未定义)
如果需要匹配外部格式,唯一的方法是
可靠地是逐字节的,插入为此所需的任何值
字节。Google#pragma pack,这是编译器在结构中使用特定对齐方式的指令……嗨,托尼,请详细说明谷歌提供的$pragma usagefirst匹配,特别是与您的编译器相关的,包括示例:标准9.6-1(尽管是旧草案)“类对象中位字段的分配由实现定义。位字段的对齐由实现定义。位字段被打包到一些可寻址的分配单元中。[注意:在某些机器上,位字段跨分配单元,而在其他机器上则不跨分配单元。”。因此,它是否工作取决于您的编译器…您说“我读了一些打包文章,但它没有改变对齐问题。”-您尝试了什么,得到了什么结果?Visual Studio确实建议使用Intel/AMD,其中CPU能够进行未对齐寻址(有时会有性能损失)。我希望编译器能够满足包对非性能最佳对齐的请求。“唯一可靠地做到这一点的方法。。。"如果您将可靠性等同于可移植性和跨编译器版本的保证一致性等,则可能是正确的,但如果您准备使用实现定义的行为,则很可能会可靠地定义和实现它……如果打包是唯一的问题,并且您不关心可移植性,那么您可能能够使用pragmas。实际上,无论如何ime打包是一个问题,所以它需要字节顺序,可能还有其他事情。