如何在C++中定义一个节省空间的8字节结构来存储两种类型的信息?

20jt8wwn  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(77)

我试图定义一个8字节的结构。这种结构必须是空间有效的,因为我们将有数百万个这样的结构,而且我们使用的内存量非常宝贵。
基于类型,结构可以包含2种不同类型的信息。
以下面的方式定义它们使其成为8字节-我假设address成为8字节,因为它被定义为结构体。有没有一个好的清洁方法来实现这一点?我可以删除内部结构体和联合体,并将其定义为62位字段,然后在代码中根据需要强制转换,但我试图避免这样做。

#pragma pack(push, 1)

struct Record{
    union {
        struct {
            uint64_t     offset:48;
            uint16_t     len:14;         
        } address;

        uint64_t  opaque:62;
    } recInfo;

    uint8_t      recType:2;      // Indicates the type of the record
};

#pragma pack(pop)
e4eetjau

e4eetjau1#

你所提出的听起来像是通过联合使用类型双关语,这是一种未定义的行为。相反,您可以将数据存储在一个类型中,并提供成员函数来访问它。

class Record {
    uint64_t data;
public:

    struct Address {
        uint64_t offset;
        uint16_t len;         
    };

    uint64_t opaque() const { return data >> 2; }
    void opaque(uint64_t value) { data = (value << 2) | OpaqueMarker; }
    Address address() const { return { data >> 16, (data >> 2) & 0x4FFF }; }
    void address(Address value) { data = (value.offset << 16) | (value.len << 2) | OffsetMarker;     
    uint8_t recType() const { return data & 0x3; }
};

相关问题