gpt4 book ai didi

c++ - 为什么 leveldb 中的 table 和 tablebuilder 使用 struct rep?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:07 25 4
gpt4 key购买 nike

最近看了leveldb的源码,对table和table_builder源码中的rep struct搞混了。

因为我们可以直接将成员变量直接存储在类Table和类TableBuilder中。

但是为什么作者做了一个struct Rep,把成员变量存放在struct Rep中。

我可以想出一个原因,因为 table 和 table_builder 会暴露给用户,所以我们想隐藏实现。这样对吗?还是我错过了其他一些想法,或者是某种设计模式?

谢谢

最佳答案

这是从 table.h 中提取的代码片段,来自 table_builder.h 的代码片段会显示类似的设计

class Table 
{
...
struct Rep;
Rep* rep_;
...
};

因此,您的解释是正确的:

  • table.htable_builder.h 的声明暴露给leveldb 客户端;
  • 但是,设计者不想公开数据的内部表示,因为它们是实现细节,在界面中是不必要的;
  • 因此,这些细节已被移出到一个单独的结构中,结构 Rep 在公共(public)接口(interface)(头文件)中声明,但仅在实现文件(源文件)中定义和使用文件);
  • 这是一个相当常见的成语,通常称为 pImpl idiom (因为指向实现 的指针通常称为pImpl)或compilation firewall .

除了设计封装,这个成语还有一个原因,那就是可用性。实际上,如果 Table.h 中公开了 Table 的内部细节,那么任何包含 Table.h 的 leveldb 用户源文件都必须是每次这些细节改变时重新编译。

通过隐藏这些实现细节,leveldb 用户的源文件不受 leveldb 数据内部表示变化的影响。只要 leveldb 公共(public)接口(interface)(公共(public)头文件)不变,用户就可以从一个版本的 leveldb 升级到另一个版本,而无需重新编译他们的源代码:他们只需要链接到新版本的 leveldb 库。

因此,这个习惯用法对于库开发人员来说极其重要,也可以用来最小化程序不同模块之间的耦合。

关于c++ - 为什么 leveldb 中的 table 和 tablebuilder 使用 struct rep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427916/

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