protobuf 内存解读(从源码分析为什么省内存)

本文深入分析protobuf 3.5的源码,揭示如何通过内存优化技术减少内存使用。通过示例展示 Pos消息序列化过程,解释字段编号、WIRETYPE_VARINT及tag的生成方式,说明protobuf如何利用最高位标识后续字节,从而理解为何128值需要两个字节,而65535值需要三个字节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码来自于 protobuf 3.5

//TestStruct.proto

message Pos{

uint32 x = 1;

uint32 y = 2;

}

Pos p;

p.set_x(1);

std::string s1 = p.SerializeAsString();

可以看到 s1.size() = 2

查看内存得到 十六进制为 0x 08 01 二进制位 00001000 0000 0001

查看生成的 TestStruct.pb.cc 文件

来看看 Pos::SerializeWithCachedSizes 的实现
  // optional uint32 x = 1 [default = 0];
  if (cached_has_bits & 0x00000001u) {
    ::google::protobuf::internal::WireFormatLite::WriteUInt32(1, this->x(), output);
  
从头文件已经得知 0x00000001u 表示 x字段的编号

::google::protobuf::internal::WireFormatLite::WriteUInt32 函数的意思是把编号为1 的字段 写到stream

在 write_format_lite.cc 里找到 

void WireFormatLite::WriteInt32(int field_number, int32 value,
                                io::CodedOutputStream* output) {
  WriteTag(field_number, WIRETYPE_VARINT, output);
  WriteInt32NoT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值