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

C++11 将1字节值和3字节值打包到单个32位结构中,c++11,C++11,诚然,这并没有给我的问题增加太多内容,但让我首先说,我在Java和C#等语言方面的背景比C/C++要重得多,我的许多困惑无疑来自这些差距 我有一个C++应用程序,它可以在任意给定时间从多达255个不同的数据源加载对象。每个共享数据源都分配了一个GUID。其中一个数据源中的每个对象都有一个24位索引。我将这些数据对象称为资源 因为每个数据源都按顺序索引其资源,所以对任何资源的引用都包括24位索引和一个附加字节,以确定给定上下文中的数据源。从而消除了运行时环境中的模糊性 如果数据对象包含对同一数据源

诚然,这并没有给我的问题增加太多内容,但让我首先说,我在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个GUI)相关。不仅针对其构建的资源的ID,还针对该资源可能包含的所有引用

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

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

涉及工会的定义是更好的策略吗


是否有我缺少的明显的通用替代方案?

您可以使用以下方法定义结构:

如果希望能够以单个32位值的形式访问ID,可以使用如下联合:

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

关于线程安全和位字段,请参阅。如果这是一个问题,那么就不要使用它们。

这会增加什么性能?(另外,您刚刚将两个“变量”放在同一个内存位置,这对线程安全有影响。)@Mat我认为性能不会比将其存储在UINT32中并自己进行位移位/屏蔽操作差,但它更具可读性。在不同平台上不存在未定义行为风险的情况下,为该结构编写标准比较运算符的最快方法是什么?您可以创建该结构和UINT32的并集,然后如果要同时比较整个结构,则比较UINT32值。另外,我不想对什么是最快的或最好的做出任何结论性的陈述,我只是想回答你的问题,即“有没有一种明显的共同选择”来替代你选择的其他方法presented@RobStone:unsigned int更具可移植性:一种替代方法是不尝试将它们打包在一起,只使用两个int。不幸的是,我确实需要给定数据集中索引的24位范围。
typedef union ResourceID {
    struct
    {
        unsigned int DataSourceIndex : 8;
        unsigned int ResourceIndex : 24;
    };
    uint32_t ID;
} ResourceID;