ProtoBuf中"缺少可选"/"空重复"字段使用了多少内存?

Seb*_*iot 11 protocol-buffers

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

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

1)省略时,可选字段的成本是多少?

我认为它应该只花了一个,因为位字段可以用来标记存在/不存在的字段,但我不知道.相反,它们可能会为每个可选字段使用整个字节.

2)当空的时候重复的字段成本是多少?是不是还一个位,如可选字段,或者是"场头" +一(varint)字节说,这是大小为0?

3)由于"字节"隐含的大小,是否有实际上是一个缺少的可选字节字段之间的尺寸差,和一个空所需要的字节字段?

[编辑]"存储器"是指文件系统或网络带宽上使用的空间; 我不是指RAM,因为这将依赖于编程语言.

Mar*_*ell 15

1:什么都没有 - 它完全省略在电线上

2:什么都没有 - 只包含实际内容; 基本上省略了一个空列表(可能的例外:空的"打包"数组;尽管可以合法地省略它)

3:省略费用; 当前和零长度成本至少 2个字节 - 一个字段头(长度取决于字段号;低字段数<32取1个字节),一个长度为零(一个字节)

附加说明:protobuf从不使用子字节打包,因此任何字段总是使用整数个字节.

(上下文:我从第一原理编写了一个protobuf实现,因此编码细节对我来说相当熟悉)