C++和压缩结构

Nic*_*ick 3 c++ struct class

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

我需要类内存表示,与我使用普通的旧C结构完全相同.我相信这称为POD或C++标准布局.

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

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

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

如果我做C - OO样式,我将需要提供指向每个函数的指针,例如

static const char *Pair::getKey(const void *mem);
Run Code Online (Sandbox Code Playgroud)

我也可以将结构化为字段并执行类似的操作

void Pair::setMem(const void *mem);
const char *Pair::getKey();
Run Code Online (Sandbox Code Playgroud)

但我越是看到这个,我就越不喜欢它,因为没有真正的优势.

我错过了什么?

Mat*_*lia 5

如果我向这个结构添加方法,可能会改变内部结构.

那是错的; 为了满足您的需求,您希望将结构保持为POD,基本上您不需要:

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

(还有一些额外的限制(参见C++11§96-10),但它们在你的情况下并不是特别相关)

"POD"事情意味着两件事:

  • 你的班级是"标准布局",大致意思是"以明确的方式布局,就像C一样"(评估你的主要关注点);

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

  • 你的班级可以自由复制,memcpy没有东西打破,这可能是你想要的,如果你直接从文件中读取(与mmap或有fread);

    这是由构造函数的"琐碎性"(即如果它们被跳过,对象没有发生任何坏事)以及缺少虚拟成员所占,这意味着你不会冒险用一个陈旧的读取来覆盖vptr文件.