c++ - 在随机访问文件中存储类数据的最佳实践

标签 c++ class struct random-access randomaccessfile

在 C 中,数据通常以 struct 数据类型组织。这对于保存在随机访问文件中非常方便,因为您可以在结构上使用 sizeof 直接跳到您想要的记录。

我不清楚在 C++ 中执行此操作的最佳方法是什么,其中您有一个包含数据的类(连同一些当然不需​​要保留的成员函数)。直接存储类似乎是错误的,因为这当然会包括指向函数的指针和那种一旦保存到文件就变成垃圾的东西。

我能想到的另一种方法是将类内部需要持久化的成员数据更改为struct,并更改访问函数以查看内部数据结构。它似乎有点过于纠结,但似乎是避免将每个字段复制两次(一次在单独的 struct 中,一次在类中)的唯一合乎逻辑的方法。

当你拥有继承时,这当然会崩溃,派生类会添加新的字段。虽然这几乎不是 C++ 和随机访问文件特有的问题,并且它在许多其他对象持久性方法(包括其他编程语言中流行的 ORM 包)中都面临着 different possible strategies even when saving to a database table for instance .

人们通常在 C++ 中使用任何“事实上的标准”方法来将类数据保存在文件中吗?无需到处复制东西?

最佳答案

简短的回答:视情况而定

中等答案:这取决于 C 结构是否可以直接序列化。

长答案:如果一个类 A 只是简单的旧数据,它将像您对 C 结构所做的那样可序列化,即二进制复制和加载 sizeof(A) 字节。如果一个类仅包含基本类型成员或它们的数组,和/或本身是 POD 的子对象,则该类是 POD 对象。它可以有方法或静态方法,但没有虚拟方法(甚至没有虚拟析构函数)。

例如 char 数组是可以接受的,但没有指针、没有字符串、没有引用,并且(一般来说)没有来自标准库的对象(特别是没有 std::string)。

当然,由于它直接存储和加载二进制数据表示,因此肯定不能跨不同架构移植,但可用于本地保存状态。

关于c++ - 在随机访问文件中存储类数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33330752/

相关文章:

c++ - Boost C++ 序列化一个 char *

python - 重新创建类对象更改一个构造函数参数

C# 类检查文件夹中是否存在文件

字符 vector 节省超过其大小

c++ - 在 map 上调用保护区时出现访问冲突

c++ - boost::signals2 仍然向引用死亡的对象发出信号

c - 没有命名成员的结构在哪里有用?

C语言编译时警告双指针

c++ - 为什么这个函数调用在通过类型转换的函数指针调用它后表现得很好?

c++ - C++中的结构和类有什么区别?