- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近看了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.h
和table_builder.h
的声明暴露给leveldb
客户端;Rep
在公共(public)接口(interface)(头文件)中声明,但仅在实现文件(源文件)中定义和使用文件);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/
读取快照是 leveldb 的完全线程安全操作吗? 具体来说, 一个线程读取 leveldb 数据库的快照,而另一个线程在同一数据库上读/写是否线程安全?那么另一个线程可能在读取时同时关闭数据库或删除
LevelDB 中是否有最大键数限制或生产力的键数限制(如 Kyoto Cabinet:记录数决定了在创建数据库之前必须计算的桶数;如果记录数超过该限制,数据库将失去生产力,但继续工作)? 最佳答案
我认为只有两个级别(级别0和级别1)就可以了,为什么LevelDB需要级别2,级别3等等? 最佳答案 我将向您指出一些关于 LevelDB 及其底层存储结构的文章的方向。 所以在documentati
我正在研究一种设计,其中数据的二级索引将使用键中的所有信息构建,而在值方面不需要任何信息。这可能会导致问题吗? 我不是问技术上是否可以有空白值。是否存在任何结构后果,例如:添加排序键可能会导致某些树结
当我尝试删除 leveldb 实例时,我得到了一些非常烦人的断言,我不确定为什么会这样! 断言发生在 version_set.cc 中文件: void VersionSet::AppendVersio
我最近在我的项目中添加了几个嵌入式框架,似乎 cocoapods 安装和构建没有问题,但是当我尝试在模拟器中运行时,我得到了这个: dyld: Library not loaded: @rpath/l
假设您不知道 leveldb 数据库中的确切键。 我尝试插入 3 个键并在键范围内使用 GetApproximateSizes,结果始终为零。 那么如何检查 leveldb 中是否有任何键呢? 最佳答
是否有一些如何仅更改 leveldb 数据库中键的值? 我已经有一个包含 1800 万行的数据库,我想更改键以添加前缀。 我在 node.js 中使用 leveldb。但任何解决方案都必须适合。 我已
在 LevelDB 中生成自增键的好的策略是什么?我的目标是能够按照键的插入顺序对其进行迭代。 最佳答案 两种方法: 使用默认比较器,但使用函数将索引键“1”转换为“000000001”,将“20”转
rocksDB 1 级中的所有键都已排序。因此我们可以在这个关卡中快速获得 key 。为什么rocksDB还需要将level 1的文件压缩到level 2? 我在 LevelDB 的 doc 上找到了
我对 LevelDB 还很陌生。我需要“回滚到特定状态”之类的东西,LevelDB 支持吗?经过一番搜索,我知道LevelDB不支持事务,但支持快照。我可以将数据库恢复到快照吗? 我的需求是这样的:
在 LevelDB 中生成自增键的好的策略是什么?我的目标是能够按照键的插入顺序对其进行迭代。 最佳答案 两种方法: 使用默认比较器,但使用函数将索引键“1”转换为“000000001”,将“20”转
我想创建一个工具来删除 Rocksdb 或 leveldb 中早于几天的所有数据,但我不知道如何启动它。 最佳答案 RocksDB 有一个特定的数据库,名为 Date_tiered DB .您可以指定
rocksDB 1 级中的所有键都已排序。因此我们可以在这个关卡中快速获得 key 。为什么rocksDB还需要将level 1的文件压缩到level 2? 我在 LevelDB 的 doc 上找到了
本文主要是对leveldb进行一个简单的介绍及使用Python语言对其进行操作的代码示例,具体如下。 leveldb 是google实现的一种非常高效的key-value数据库。key-value
是否可以将多个键映射到同一个值?如果没有,是否有解决此功能的方法? 最佳答案 这是不可能的。我使用的一种解决方法是让第二个键上的值成为指向主键的指针。也就是说,第二个键的值是主键。 特别是,我制作了一
LevelDB key 是否有 key 长度限制? 我想以 url 为键保存数据。所以这个网址可以很长 例如http://veryveryveryveryveryveryveryveryveryver
有人可以告诉我这个吗: 尝试在node.js实例中使用levelDb来存储name键和ID字符串,我希望能够检查ID 已经在数据库中,所以... 查看documentation我不知道我做错了什么。
我正在寻找一种有效的方法来使用 leveldb 来实现键枚举器以按键前缀进行迭代。键是字节数组(并且数据库使用默认字节数组比较器,因此具有特定前缀的所有键都按顺序存储/检索),我希望我的迭代器能够采用
我正在使用 LevelDB from Java via JNI . 我想提供一个数字(整数)键,并能够按照该键的顺序迭代数据库。我遇到困难的地方是理解 LevelDb 的默认比较器实际上是如何工作的,
我是一名优秀的程序员,十分优秀!