小编DeL*_*ean的帖子

使用磁盘数据结构时,最佳方法是什么?

我想知道如何最好地处理磁盘上的数据结构,因为存储布局需要与逻辑设计完全匹配.我发现当你需要为你的存储设置一个特定的布局时,结构对齐和打包并没有多大帮助.

我解决这个问题的方法是使用处理器指令定义结构的(宽度),并在添加跟随逻辑结构模型的数据后将写入磁盘的分配字符(字节)数组时使用宽度.

例如:

typedef struct __attribute__((packed, aligned(1))) foo {
   uint64_t some_stuff;
   uint8_t flag;
} foo;
Run Code Online (Sandbox Code Playgroud)

如果我坚持foo on-disk,那么"flag"值将出现在数据的最后.鉴于我可以在使用&foo类型的fread读取数据时轻松使用foo,然后通常使用struct而不需要任何进一步的字节摆弄.

相反,我更喜欢这样做

#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));
Run Code Online (Sandbox Code Playgroud)

然后我只使用fwrite和fread来提交和读取字节,但稍后解压缩它们以便使用存储在各种逻辑字段中的数据.

我想知道哪种方法最好用,因为我希望磁盘存储的布局与逻辑布局相匹配......这只是一个例子......

如果有人知道每个方法在解码/解包字节方面的效率与直接从它的盘上表示复制结构请分享,我个人更喜欢使用第二种方法,因为它让我完全控制存储布局但我还没准备好牺牲性能寻找性能,因为这种方法需要大量的循环逻辑来解包/遍历字节到数据中的各个边界.

谢谢.

c struct on-disk

11
推荐指数
1
解决办法
307
查看次数

标签 统计

c ×1

on-disk ×1

struct ×1