gpt4 book ai didi

c++ - 结构/类位字段打包

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:16 26 4
gpt4 key购买 nike

我想使用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 位 CPU 上):
pMyBitField 的 a 字段为 0x12,
pMyBitField 的 b 字段为 0x9A785634,
pMyBitField 的 a 字段为 0xFFFFDEBC。

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

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

*我看了一些打包的帖子,但并没有改变对齐问题。

谢谢!

最佳答案

我希望您的代码无法编译。 rawData 是数组类型;这隐式转换为指针,但不能转换为类类型,隐式或显式。

对于其余部分,编译器如何布置位域是实现已定义,但在您的情况下,我希望它是无关紧要的;在 32 位上机器,一个 32 位位域通常会强制编译器使用下一个字,所以只有第一个位域有任何影响。取决于编译器,它会导致编译器将值放在高订购 8 位,或低位 8 位(并保留字的其余部分未定义)。

如果需要匹配外部格式,唯一的办法就是这样reliablely 是逐字节的,插入任何必要的值字节。

关于c++ - 结构/类位字段打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10681256/

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