gpt4 book ai didi

c++ - 为什么使用 24 位整数时结构的大小没有改变

转载 作者:行者123 更新时间:2023-11-30 01:43:26 26 4
gpt4 key购买 nike

我正在尝试在 Windows 平台上移植嵌入代码。我遇到了以下问题,我在这里发布了示例代码。即使在我使用 int24 之后,大小在 Windows 中仍然是 12 个字节,为什么?

struct INT24
{
INT32 data : 24;
};

struct myStruct
{
INT32 a;
INT32 b;
INT24 c;
};

int _tmain(int argc, _TCHAR* argv[])
{
unsigned char myArr[11] = { 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF };
myStruct *p = (myStruct*)myArr;
cout << sizeof(*p);
}

最佳答案

有两个原因,每个原因本身就足够了。

  • INT32 的大小大概是 4 个字节。 INT24 的大小也是 4 个字节,因为它包含一个 INT32 位域。由于 myStruct 包含 3 个大小为 4 的成员,因此其大小必须至少为 12。
  • 大概 INT32 的对齐要求是 4。因此,即使 INT24 的大小为 3,myStruct 的大小仍然必须为 12,因为它必须至少具有 INT32 的对齐要求,因此 myStruct 的大小必须填充到最接近的 4 的倍数。

any way or workaround ?

这是特定于实现的,但以下 hack 可能适用于某些编译器/cpu 组合。有关类似功能的语法,请参阅编译器手册,以及 objective-c pu 的手册是否支持未对齐的内存访问。还要意识到未对齐的内存访问确实会降低性能。

#pragma pack(push, 1)
struct INT24
{
INT32 data : 24;
};
#pragma pack(pop)

#pragma pack(push, 1)
struct myStruct
{
INT32 a;
INT32 b;
INT24 c;
};
#pragma pack(pop)

打包位域在所有编译器中的工作方式可能不同。请务必检查您的行为。

我认为符合标准的方法是存储大小为 3 和 4 的字符数组,每当您需要读取或写入其中一个整数时,您必须 std::memcpy 值(value)。实现起来会有点麻烦,而且可能比 #pragma pack hack 慢。

关于c++ - 为什么使用 24 位整数时结构的大小没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37831804/

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