使用 #pragma pack 时仍然会发生结构体的 C++ 填充

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

我正在尝试使用 C++ 结构实现 24 位整数数据类型。我希望它的大小为 24 位/3 字节——而不是填充到 4 字节 int 中。我正在使用 Visual Studio Community 2019 的编译器。

我尝试使用 #pragma pack 来防止这种情况,如下所示,但 sizeof( int24 ) 仍然返回 4。

#pragma pack(push, 1)

struct int24{
    unsigned int data : 24;
};

#pragma pack(pop)

如何使结构体的大小为 3 个字节?如果可能的话,我想避免使用无符号字符数组。

c++ visual-c++ struct pragma-pack
1个回答
0
投票

根据我对

#pragma pack
文档的理解,它仅与在结构中的成员之间添加填充字节有关。

为了实现您想要的目的,您可以使用一个包含 3 个字节的

std::array
的结构,并使用访问器将
uint32_t
值转换为它/从它转换:

#include <iostream>
#include <array>

struct int24 {
    std::array<uint8_t,3> bytes;

    explicit int24(uint32_t value)
    {
        set(value);
    }

    void set(uint32_t value)
    {
        bytes[0] = static_cast<uint8_t>(value & 0x000000ff);
        bytes[1] = static_cast<uint8_t>((value & 0x0000ff00) >> 8);
        bytes[2] = static_cast<uint8_t>((value & 0x00ff0000) >> 16);
    }

    unsigned int get()
    {
        uint32_t value = bytes[0] + (bytes[1] << 8) + (bytes[2] << 16);
        return value;
    }
};

int main()
{
    std::cout << sizeof(int24) << std::endl;
    int24 i24{ 12345 };
    std::cout << i24.get();
}

输出:

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