c - 使用磁盘数据结构时最好的方法是什么

标签 c struct on-disk

鉴于存储布局需要与逻辑设计完全匹配,我想知道如何最好地使用磁盘上的数据结构。我发现当您需要特定的存储布局时,结构对齐和打包并没有太大帮助。

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

例如:

typedef struct __attribute__((packed, aligned(1))) foo {
   uint64_t some_stuff;
   uint8_t flag;
} foo;

如果我将 foo 保存在磁盘上,“标志”值将出现在数据的最后。鉴于我可以在使用 fread 读取数据时轻松地使用 foo 在 &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 来提交和读取字节,然后解压缩它们以使用存储在各种逻辑字段中的数据。

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

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

谢谢。

最佳答案

根据您的要求(考虑外观和性能),第一种方法更好,因为编译器会为您完成艰苦的工作。换句话说,如果一个工具(在这种情况下是编译器)为您提供了某些功能,那么您不想自己实现它,因为在大多数情况下,工具的实现会比您的效率更高。

关于c - 使用磁盘数据结构时最好的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27015937/

相关文章:

c - 如何在不使用 strcpy 的情况下将字符数组复制到 char 指针

c - C中的直接调用与间接调用

c - 使用 fork 创建的新进程,但为变量打印相同的地址

c - 使用程序集中的 getchar 获取()函数

c - malloc 的结构问题

matlab - 从结构的多个字段中提取行

c++ - 指向成员结构的指针如何工作?

java - Java 中的 B+Tree 磁盘实现