将1字节值和3字节值打包到单个32位结构中

时间:2015-03-03 06:34:23

标签: c++11

虽然它确实没有给我的问题增加太多,但我首先要说的是,我的背景在Java和C#等语言中比C / C ++更重,而且我的困惑无疑来自这些差距。

我有一个C ++应用程序,可以在任何给定时间从多达255个不同的数据源加载对象。为每个共享数据源分配GUID。其中一个数据源中的每个对象都使用24位索引进行键控。我将这些数据对象称为资源

因为每个数据源按顺序索引它的资源,所以对任何资源的引用都包括24位索引和一个额外的字节来确定给定上下文中的数据源。从而消除了运行时环境中的歧义。

如果数据对象包含对同一数据源中的资源的引用,则此字节将加载0值。如果它引用另一个数据源中的对象,则该字节用作数据源的“依赖关系表”的索引,其中最多128个GUID用于其他数据源。

我倾向于将这些资源键的C结构定义为:

typedef struct ResourceID {
    char DataSourceIndex;
    char[3] ResourceIndex;
} ResourceID;

问题是,在我的应用程序中的工厂类可以构建完整的资源对象之前,它必须解析每个ResourceID的DataSourceIndex以与应用程序自己的运行时上下文表(最多255个GUID)相关联。不仅是它正在构建的资源的ID,还包括资源可能包含的所有引用。

虽然上面的结构非常容易以这种方式解决,但我不知道它是否像典型的UINT32一样友好或高效,可用于性能关键应用程序中的比较。虽然我有点担心在这种情况下字节序可能会成为一个偷偷摸摸的问题。

使用单个UINT32成员和使用位运算符读取/写入数据源索引字节的方法可以更好地实现此结构吗?

涉及工会的定义是否会成为更好的策略?

我缺少一个明显的常见替代方案吗?

1 个答案:

答案 0 :(得分:3)

您可以使用bitfields定义结构:

typedef struct ResourceID {
    unsigned int DataSourceIndex : 8;
    unsigned int ResourceIndex : 24;
} ResourceID;

如果您希望能够将ID作为单个32位值访问,则可以使用这样的联合:

typedef union ResourceID {
    struct
    {
        unsigned int DataSourceIndex : 8;
        unsigned int ResourceIndex : 24;
    };
    uint32_t ID;
} ResourceID;

关于线程安全性和位域,请参阅this StackOverflow question。如果这是一个问题,那么不要使用它们。