在添加一个布尔字段的情况下,PB消息的序列化大小增加2字节



我正在构建包含4个int32字段的PB消息。我想在此消息中再添加两个布尔字段。我注意到两个布尔字段的大小增加了4个字节。布尔值是否每个字段占用2字节。

每个字段头占用1字节(对于低字段数;更多用于大字段数),每个bool值为1字节。在protobuf中没有子字节封装;结果四舍五入到最接近的字节

1选项是存储一个无符号整数映射,即将每个bool值视为2的幂,并将它们相加(按位)。然后你需要一个字节头和一个字节数据,所以两个都是2字节。但是,您必须自己打包/解包整数。假设您有一个低字段数,那么最多7个bool就是1字节数据加上1字节报头。由于"varint"使用base-128编码(msb是延续),第8个bool(最多14个bool)将使用2字节的数据加上1字节的头。

这并不奇怪。它可能使用一个字节作为以下值的类型标志,然后将该位存储在一个字节中。您可以将许多位打包成整数类型(char类型为8位,short类型为16位,int类型为32位)以提高传输效率。节省的带宽是否值得编写和运行打包代码的麻烦将取决于您的应用程序。

空间和访问时间总是要权衡的。

您的JVM设计者可以选择许多方法来进行权衡。可能他选择坚持结构总是占用4字节的倍数,所以每个结构都是长字对齐的。也许他决定布尔值应该每个占用两个字节,因为这样可以使寻址更简单。他可能在一个字节中为两个布尔值分别分配了1位,然后将其填充到两个字节的边界。

如果不确切地知道结构是如何布局的,以及对布尔值的访问是如何工作的,您将无能为力。

最新更新