Google的Protocol Buffer序列化库在3.x之后增加了Arena分配功能,通过Arena机制可以将生成的内存Message子类的成员中的动态内存,统一聚合分配在一起。对于比较复杂的结构,可以降低动态申请内存的频次降低全局竞争,同时大幅减轻甚至消除析构动作开销
但是,对于string类型的字段,由于一直采用了std::string的表达形式导致实际data的内存管理无法托管到arena上,这也限制了一些场景下最大化发挥Arena能力的可能性。参见protobuf/issues/4327,Google内部采用了hack std::string表达能力的方式进行了特化支持,虽然开源版本并未释出,但是从未文档化的Donated String机制可以看出其实现方案,可以参见google/protobuf/inlined_string_field.h和google/protobuf/arenastring.h内的相关接口和注释信息
根据这些透出的内部接口,babylon用过patch的方式实现了这个hack机制,不过实现为了模拟成看起来像std::string,针对gnu libstdc++和llvm libc++两种主流std库进行了针对支持,patch无法适用于其他的std库实现。但是对于当今主流生产环境而言,可以覆盖绝大多数应用场景
补丁分版本维护在内置注册仓库中,可以直接采用bzlmod机制依赖
# in .bazelrc
common --registry=https://baidu.github.io/babylon/registry
# in MODULE.bazel
bazel_dep(name = 'protobuf', version = '28.3.arenastring')
这里可以找到一个结合brpc使用补丁的例子use-arena-with-brpc以及一些性能演示