我想知道如何最好地处理磁盘上的数据结构,因为存储布局需要与逻辑设计完全匹配.我发现当你需要为你的存储设置一个特定的布局时,结构对齐和打包并没有多大帮助.
我解决这个问题的方法是使用处理器指令定义结构的(宽度),并在添加跟随逻辑结构模型的数据后将写入磁盘的分配字符(字节)数组时使用宽度.
例如:
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来提交和读取字节,但稍后解压缩它们以便使用存储在各种逻辑字段中的数据.
我想知道哪种方法最好用,因为我希望磁盘存储的布局与逻辑布局相匹配......这只是一个例子......
如果有人知道每个方法在解码/解包字节方面的效率与直接从它的盘上表示复制结构请分享,我个人更喜欢使用第二种方法,因为它让我完全控制存储布局但我还没准备好牺牲性能寻找性能,因为这种方法需要大量的循环逻辑来解包/遍历字节到数据中的各个边界.
谢谢.