0%

C++ 防止头文件暴露私有变量

C++ 中可以通过嵌套类的形式防止成员私有变量暴露在头文件里。

1
2
3
4
5
6
7
8
9
10
// 头文件
class Exposure {

Exposure();
int interface(int foo);

private:
class Impl;
std::unique_ptr<Impl> impl_;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// 源文件
class Exposure::Impl {
// 具体实现
int interfaceImpl(int foo){
return 0;
}
}

Exposure::Exposure() : impl_(std::make_unique<Impl>()){}

int Exposure::interface(int foo){
return this->impl_->interfaceImpl(foo);
}

BSON 结构分析

BSON 简介

BSON 全称是 Binary JSON, 和 JSON 很像,但是采用二进制格式进行存储。相比 JSON 有以下优势:

  • 访问速度更快。BSON 会存储 Value 的类型,相比于明文存储,不需要进行字符串类型到其他类型的转换操作。以整型 12345678 为例,JSON 需要将字符串转成整型,而 BSON 中存储了整型类型标志,并用 4 个字节直接存储了整型值;
  • 存储空间更低。还是以整型 12345678 为例,JSON 采用明文存储的方式需要 8 个字节,但是 BSON 对于 Int32 的值统一采用 4 字节存储,Long 和 Double 采用 8 字节存储。 当然这里说存储空间更低也分具体情况,比如对于小整型,BSON 消耗的空间反而更高;
  • 数据类型更丰富。BSON 相比 JSON,增加了 BinData,TimeStamp,ObjectID,Decimal128 等类型。

BSON 存储格式

一条最简单的 BSON 文档,从前向后可以拆解成以下几个部分:

  1. 文档的总长度, 占 4 个字节;
  2. Value 类型,参考代码定义,占 1 个字节;
  3. Key 的 String 表示形式(Key 只能 String 类型),长度不固定,以 ‘\0’ 结尾,占 len(Key)+1 个字节;
  4. Value 的二进制存储,比如 Int32 占 4 字节,Long 和 Double 占 8 个字节等;
  5. 文档以 ‘\0’ 结尾,也就是在遍历 BSON 到末尾时,常见的 EOO(End Of Object),占 1 个字节;

紧凑格式的缺点

BSON 的存储格式非常紧凑,不同的键值对之间是无间隔存储。因此,修改 BSON 中的某一字段意味着需要组织处一个新的 BSON 对象。如果增加、删除或者修改了某个字段,要生成新 BSON 文档,而非在原有 BSON 文档上原地修改。

在使用 MongoDB 时,可以使用 JSON 格式来暂时存储数据以便在不同的程序模块之间传递。当数据需要插入 MongoDB 时,再将数据封存,转换为 BSON 格式。