nanopb 尺寸要求
nanopb oneof size requirements
我遇到了 nanopb 并想在我的项目中使用它。我正在为嵌入式设备编写代码,因此内存限制是一个真正的问题。
我的目标是在设备之间传输数据项,每个数据项都有一个 32 位标识符和一个值。该值可以是从 1 个字符到浮点数到长字符串的任何值。我想知道针对此类问题声明消息的最有效方法是什么。
我在想这样的事情:
message data_msg{
message data_item{
int32 id = 1;
oneof value{
int8 ival = 2;
float fval = 3;
string sval = 4;
}
}
repeated data_item;
}
但据我了解,这会转换为 C 并集,这是最大元素的大小。假设我将字符串限制为 50 个字符,那么联合总是 50 个字节长,即使我需要 4 个字节用于浮点数。
我是否理解正确或有其他方法可以做到这一点?
谢谢!
你的理解是正确的,C中的结构大小将等于oneof的最大成员的大小。然而这只是内存中的大小,序列化后的消息大小将是内容所需的最小值。
如果内存大小是个问题,有几个选项可用。分配最大可能需要的大小的默认值使内存管理变得容易。如果你只想动态分配所需的内存量,你必须决定你想怎么做:
使用PB_ENABLE_MALLOC
编译选项,可以对字符串等大字段使用FT_POINTER
字段类型。然后将使用系统堆中的 malloc()
分配内存。
使用 FT_CALLBACK
,而不是分配任何内存,您将获得一个回调,您可以在其中读出字符串并以任何您想要的方式处理或存储它。例如,如果您想将字符串写入 SD 卡,则无需将其完全存储在内存中。
在整个系统设计中,所需最大大小的静态分配通常是最容易测试的。如果数据适合一次,它将永远适合。如果您选择动态分配,则需要更仔细地分析所需的最大可能内存使用量。
我遇到了 nanopb 并想在我的项目中使用它。我正在为嵌入式设备编写代码,因此内存限制是一个真正的问题。
我的目标是在设备之间传输数据项,每个数据项都有一个 32 位标识符和一个值。该值可以是从 1 个字符到浮点数到长字符串的任何值。我想知道针对此类问题声明消息的最有效方法是什么。
我在想这样的事情:
message data_msg{
message data_item{
int32 id = 1;
oneof value{
int8 ival = 2;
float fval = 3;
string sval = 4;
}
}
repeated data_item;
}
但据我了解,这会转换为 C 并集,这是最大元素的大小。假设我将字符串限制为 50 个字符,那么联合总是 50 个字节长,即使我需要 4 个字节用于浮点数。
我是否理解正确或有其他方法可以做到这一点?
谢谢!
你的理解是正确的,C中的结构大小将等于oneof的最大成员的大小。然而这只是内存中的大小,序列化后的消息大小将是内容所需的最小值。
如果内存大小是个问题,有几个选项可用。分配最大可能需要的大小的默认值使内存管理变得容易。如果你只想动态分配所需的内存量,你必须决定你想怎么做:
使用
PB_ENABLE_MALLOC
编译选项,可以对字符串等大字段使用FT_POINTER
字段类型。然后将使用系统堆中的malloc()
分配内存。使用
FT_CALLBACK
,而不是分配任何内存,您将获得一个回调,您可以在其中读出字符串并以任何您想要的方式处理或存储它。例如,如果您想将字符串写入 SD 卡,则无需将其完全存储在内存中。
在整个系统设计中,所需最大大小的静态分配通常是最容易测试的。如果数据适合一次,它将永远适合。如果您选择动态分配,则需要更仔细地分析所需的最大可能内存使用量。