我有数据库项目,我想从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)
但我越是看到这个,我就越不喜欢它,因为没有真正的优势.
我错过了什么?
如果我向这个结构添加方法,可能会改变内部结构.
那是错的; 为了满足您的需求,您希望将结构保持为POD,基本上您不需要:
(还有一些额外的限制(参见C++11§96-10),但它们在你的情况下并不是特别相关)
"POD"事情意味着两件事:
你的班级是"标准布局",大致意思是"以明确的方式布局,就像C一样"(评估你的主要关注点);
添加方法不应该破坏东西,因为它们不是虚拟的,它们被翻译为自由函数,它将指向对象的指针作为隐藏参数,并且不需要修改原始C布局.
static
方法只是具有不同范围的自由函数,因此通常它们不是问题.
你的班级可以自由复制,memcpy
没有东西打破,这可能是你想要的,如果你直接从文件中读取(与mmap
或有fread
);
这是由构造函数的"琐碎性"(即如果它们被跳过,对象没有发生任何坏事)以及缺少虚拟成员所占,这意味着你不会冒险用一个陈旧的读取来覆盖vptr文件.
归档时间: |
|
查看次数: |
1878 次 |
最近记录: |