Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构/类位字段打包_C++_C_Bit Manipulation - Fatal编程技术网

C++ 结构/类位字段打包

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

我想使用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 = (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打包是一个问题,所以它需要字节顺序,可能还有其他事情。