为什么 2^29-1 是协议缓冲区中最大的键

why 2^29-1 is the biggest key in protocol buffers

2^29 -1 ? 因为"Field numbers 1-15 have a 1-byte tag."
32字节没有tag?我知道3字节,但为什么没有标签?

那是 varint 吗?我无法理解 protobuf\descriptor.cc 源代码。

所有字段都有一个标签,但对于编号为 16 及更高的字段,标签需要多个字节。因此,字段编号 1 到 15 应该用于最常见的字段。是的,编码是 varint。

最大的键是2^29,因为最低3位用于存储字段数据类型。所以 29 + 3 = 32 正好符合 uint32_t.

您可以在此处找到更多信息: https://developers.google.com/protocol-buffers/docs/encoding#structure