::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];
message Test
{
optional int32 aa = 1;
optional int32 bb = 2;
}
可以看出上面messgae有两个optional字段
当生成对应的代码的时候
proto帮我们同时生成了一个 ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];
这里的2意思的两个字段,实际上就是一个bit数组,用位去标示每一个字段是否存在
依次从低位到高位,分别标示从aa到bb等等
很厉害吧
其实这也是我们工作常用的一种做法。
在message比较大的时候,optional可以很好的节省数据空间。
比较小的时候_has_bits_就占了你的空间哦