Protocol buffers “使用了多少内存?”;缺少可选的“/&引用;空重复;ProtoBuf中的字段?

Protocol buffers “使用了多少内存?”;缺少可选的“/&引用;空重复;ProtoBuf中的字段?,protocol-buffers,Protocol Buffers,我正在尝试用ProtoBuf设计我的第一个文件格式,在某些情况下,我不确定什么是最佳选择,因为内存/流布局对我来说并不完全清楚 所以我实际上有几个问题,但都是密切相关的: 1) 当一个可选字段被省略时,它的成本是多少 我认为它应该只花费一位,因为位字段可以用来标记当前/不存在的字段,但我不确定。它们可能会对每个可选字段使用一个完整的字节 2) 重复字段为空时的成本是多少?它也是一位,像可选字段一样,还是“字段头”+一个(变量)字节表示大小为0 3) 既然“bytes”隐含着一个大小,那么缺失的可

我正在尝试用ProtoBuf设计我的第一个文件格式,在某些情况下,我不确定什么是最佳选择,因为内存/流布局对我来说并不完全清楚

所以我实际上有几个问题,但都是密切相关的:

1) 当一个可选字段被省略时,它的成本是多少

我认为它应该只花费一位,因为位字段可以用来标记当前/不存在的字段,但我不确定。它们可能会对每个可选字段使用一个完整的字节

2) 重复字段为空时的成本是多少?它也是一位,像可选字段一样,还是“字段头”+一个(变量)字节表示大小为0

3) 既然“bytes”隐含着一个大小,那么缺失的可选bytes字段和空的required bytes字段之间是否存在大小差异


[编辑]我所说的“内存”是指文件系统上使用的空间或网络带宽;我不是说RAM,因为它依赖于编程语言。

1:什么都没有——它在线路上被完全省略了

2:无任何内容-仅包括实际内容;空列表基本上被省略了(可能的例外:空的“压缩”数组;尽管即使这样也可以合法地省略)

3:省略不花费任何费用;当前和零长度成本至少2个字节-一个字段标题(长度取决于字段编号;低字段编号<32取1个字节)和一个零长度(一个字节)

附加说明:protobuf从不使用子字节打包,因此任何字段都始终使用完整的字节数


(上下文:我已经根据第一原则编写了一个protobuf实现,因此我对它们相当熟悉)

我已经阅读了您链接到的文档,没有看到任何明确说明省略的
可选
字段不会在线路上省略的内容。文档中指出,
编码的消息可能有,也可能没有与该标签号相匹配的键值对,
,这听起来不像是一种保证。你能澄清一下吗?@Elpezmuerto-关键点是“零或更多”;“省略”的全部要点是它是零情况。正是这一点允许消息的前向兼容性。是的,编写器可以发出默认值的字节,但是它不会被“忽略”——它肯定会有一个值,而接收器将无法检测到它是被忽略的值