gpt4 book ai didi

C++ 和压缩结构

转载 作者:太空狗 更新时间:2023-10-29 19:57:41 26 4
gpt4 key购买 nike

我有一个数据库项目,我想从 C 迁移到 C++。在这个 C 项目中,我有很多小型打包结构,我直接写入文件或从 mmaped 文件中读取 - 例如直接从内存地址。

我需要类在内存中的表示,就像我使用普通的旧 C 结构一样。我相信这称为 POD 或 C++ 标准布局。

我可以通过几种方式进行:

我可以做类,但我担心如果我向这个结构添加方法,内部结构可能会改变。

如果我将 a 结构包装到类中,我将需要一直创建/销毁类以及结构。

如果我使用 C - OO 风格,我将需要提供指向每个函数的指针,例如

static const char *Pair::getKey(const void *mem);

我也可以让结构体成为一个字段并做类似的事情

void Pair::setMem(const void *mem);
const char *Pair::getKey();

但是这个越看越不喜欢,因为没有真正的优势。

有什么我想念的吗?

最佳答案

If I add methods to this struct, probably the internal structure will be changed.

这是错误的;为了满足您的需求,您想要的是将您的结构保持为 POD,但实际上您并不想要:

  • 非平凡的构造函数/析构函数/赋值运算符;
  • 虚函数或虚基类;
  • 数据成员的不同访问说明符

(有一些额外的限制(参见 C++11 §9 ¶6-10),但它们与您的情况并不特别相关)

“POD”意味着两件事:

  • 您的类是“标准布局”,大致意思是“以明确定义的方式布局,就像 C 会做的那样”(评估您的主要关注点);

    添加方法不应该破坏东西,因为它们不是虚拟的,它们被转换为自由函数,将指向对象的指针作为隐藏参数,并且不需要修改原始 C 布局。static 方法只是具有不同作用域的自由函数,因此通常它们不是问题。

  • 您的类可以使用 memcpy 自由复制而不会破坏内容,如果您直接从文件中读取它(使用 mmap),这可能是您想要的> 或使用 fread);

    这是由于构造函数的“琐碎”(即,如果跳过它们,您的对象不会发生任何坏事)和虚拟成员的缺失,这意味着您不会冒险用陈旧的 vptr 覆盖一个从文件中读取。

关于C++ 和压缩结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30956587/

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