虽然这确实没有给我的问题增加太多内容,但首先我要说的是,我对 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 成员和使用位运算符读/写数据源索引字节的方法可以更好地实现此结构吗?
涉及工会的定义是更好的策略吗?
是否有我缺少的明显常见替代方案?
最佳答案
您可以使用 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 。如果这是一个问题,那么就不要使用它们。
关于c++11 - 将 1 字节值和 3 字节值打包到单个 32 位结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28825510/