我正在尝试在ProtoBuf中设计我的第一个文件格式,我不确定在某些情况下什么是最佳选择,因为内存/流布局对我来说并不完全清楚。
所以我实际上有几个问题,但都是密切相关的:
1)省略可选字段的成本是多少?
我认为它应该只花费一个位,因为位字段可用于标记当前/不存在的字段,但我不确定。相反,它们可能会为每个可选字段使用整个字节。
2)空白时重复的字段成本是多少?它是一个比特,如可选字段,还是“字段标题”+一个(varint)字节,它说它的大小为0?
3)由于“bytes”隐式有一个大小,实际上缺少的可选字节字段和空的必需字节字段之间是否存在大小差异?
[编辑]“内存”我指的是文件系统或网络带宽上使用的空间;我不是指RAM,因为这将取决于编程语言。
答案 0 :(得分:14)
1:什么都没有 - 它在线上完全省略
2:什么都没有 - 只包含实际内容;基本上省略了一个空列表(可能的例外:空的“打包”数组;尽管可以合理地省略它)
3:省略任何费用;当前和零长度成本至少 2个字节 - 一个字段头(长度取决于字段编号;低字段数< 32取1个字节),一个长度为零(一个字节)附加说明:protobuf从不使用子字节打包,因此任何字段总是使用整数个字节。
(上下文:我从第一原则编写了一个protobuf实现,所以encoding details对我来说非常熟悉)