编码的 nanopb 协议缓冲区消耗的内存比预期的多

Encoded nanopb protocol buffer consumes more memory than expected

我正在尝试转换以下 C 结构:

typedef struct _algo_stream_debug_pkt {
  uint16_t  src; 
  uint16_t  dest; 
  uint16_t  length; 
  uint16_t  crc; 
  uint8_t  command; 
  uint8_t  status; 
  uint16_t  sequence_num; 
  uint32_t  timestamp; 
  uint16_t  data_state; 
  uint16_t  algo_out_x1; 
  uint16_t  algo_out_x2; 
  uint16_t  algo_out_x2; 
  uint16_t  algo_interval; 
  uint16_t  debug_info[10]; 
} algo_stream_debug_pkt ;

使用以下 .proto 文件到协议缓冲区:

message m_header {
    required int32 src = 1;
    required int32 dst = 2;
    required int32 len = 3;
    required int32 crc = 4;
}

message algo_stream_debug_pkt {
    required m_header        header          = 1;
    required int32  command                  = 2; 
    required int32  status                   = 3; 
    required int32  sequence_num             = 4;                  
    required int32  timestamp                = 5;          
    required int32  data_state               = 6;              
    required int32  algo_out_x1              = 7;  
    required int32  algo_out_x2              = 8;            
    required int32  algo_out_x3              = 9;        
    required int32  algo_interval            = 10;
    repeated int32  debug_info               = 11;
}

和以下 .option 文件:

algo_stream_debug_pkt.debug_info max_count:10

问题是 algo_stream_debug_pkt 类型的编码协议缓冲区数据在我的用例中使用了大约 58 个字节(当流式传输到内存时)。 algo_stream_debug_pkt 的实际 c 结构仅使用 48 个字节 [sizeof(algo_stream_debug_pkt) -> 48]。我想知道为什么协议缓冲区版本比非编码的 c 结构版本消耗更多 space,因为 nanopb 使用 varints 来表示整数类型,因此实际编码版本应该比最初指定的类型消耗更少的内存。

The issue is that the encoded protocol buffer data of type algo_stream_debug_pkt uses approximately 58 bytes (when streamed to memory) for my use case. The actual c structure of algo_stream_debug_pkt uses just 48 bytes [ sizeof(algo_stream_debug_pkt) -> 48 ]

每个protobuf字段都以字段标签号为前缀,至少占用一个字节。字段标签占用 15 个字节,header 子消息和 debug_info 数组长度占用 2 个字节。

另一方面,一些space通过将值编码为可变长度整数来保存,对于小于128的值只占用一个字节。

一般的protobuf格式比较space-efficient,但不是压缩格式。协议中forward-和backward-compatibility的要求也会造成一些开销