gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:45:24 31 4
gpt4 key购买 nike

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

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

例如:

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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com