我正在尝试在 ProtoBuf 中设计我的第一个文件格式,但我不确定在某些情况下什么是最佳选择,因为内存/流布局对我来说并不完全清楚。
所以我实际上有几个问题,但都密切相关:
1) 省略时可选字段的成本是多少?
我认为它应该只花费一位,因为位字段可用于标记存在/不存在的字段,但我不确定。他们可能会改为使用每个可选字段的整个字节。
2) 当一个重复的字段为空时,它的成本是多少?它也是一位,就像可选字段一样,还是“字段标题”+一个(varint)字节来表示大小为0?
3) 由于“字节”隐式具有大小,缺少的可选字节字段和空的必需字节字段之间实际上是否存在大小差异?
[编辑]“内存”是指文件系统或网络带宽上使用的空间;我不是指 RAM,因为这将取决于编程语言。
最佳答案
1:什么都没有 - 它在电线上完全省略
2:什么都没有——只包含实际内容;一个空列表基本上被省略(可能的异常(exception):空的“打包”数组;尽管即使这样也可以合法地省略)
3:省略不花钱;当前和零长度成本 至少 2 个字节 - 一个字段头(长度取决于字段编号;低字段编号 < 32 占用 1 个字节),一个长度为零(一个字节)
附加说明:protobuf 从不使用子字节打包,因此任何字段始终使用整数字节。
(上下文:我已经根据基本原理编写了一个 protobuf 实现,所以 encoding details 对我来说相当熟悉)
关于protocol-buffers - ProtoBuf 中的 "missing optional"/"empty repeated"字段使用了多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8649749/