鉴于存储布局需要与逻辑设计完全匹配,我想知道如何最好地使用磁盘数据结构。我发现当您需要为存储设置特定布局时,结构对齐和包装并没有太大帮助。
我解决这个问题的方法是使用处理器指令定义结构的(宽度),并在分配遵循逻辑结构模型的数据后写入磁盘的字符(字节)数组时使用宽度。
例如:
typedef struct __attribute__((packed, aligned(1))) foo {
uint64_t some_stuff;
uint8_t flag;
} foo;
如果我将 foo 持久保存在磁盘上,则“标志”值将出现在数据的最后。鉴于我可以在使用 &foo 类型的 fread 读取数据时轻松使用 foo ,然后正常使用该结构而无需任何进一步的字节摆弄。
相反,我更喜欢这样做
#define foo_width sizeof(uint64_t)+sizeof(uint8_t)
uint8_t *foo = calloc(1, foo_width);
foo[0] = flag_value;
memcpy(foo+1, encode_int64(some_value), sizeof(uint64_t));
然后我只使用 fwrite 和 fread 提交和读取字节,但后来解压缩它们以使用存储在各种逻辑字段中的数据。
我想知道哪种方法最好使用,因为我希望磁盘存储的布局与逻辑布局相匹配……这只是一个例子……
如果有人知道每种方法在解码/解包字节与直接从其磁盘表示复制结构方面的效率如何,请分享,我个人更喜欢使用第二种方法,因为它可以让我完全控制存储布局,但我还没有准备好牺牲寻找性能,因为这种方法需要大量循环逻辑来解包/遍历字节到数据中的各种边界。
谢谢。