nanopb одно из требований к размеру
Я наткнулся на 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 union, который является размером самого большого элемента. Скажем, я ограничиваю строку 50-ю символами, тогда объединение всегда имеет длину 50 байт, даже если мне нужно 4 байта для числа с плавающей запятой.
Правильно ли я понял это или есть другой способ сделать это?
Спасибо!
1 ответ
Ваше понимание верно, размер структуры в C будет равен размеру наибольшего члена oneof. Однако это только размер в памяти, размер сообщения после сериализации будет минимально необходимым для содержимого.
Если размер в памяти является проблемой, есть несколько доступных вариантов. Значение по умолчанию для выделения максимально возможного необходимого размера упрощает управление памятью. Если вы хотите динамически распределять только необходимый объем памяти, вам нужно решить, как вы хотите это сделать:
С помощью
PB_ENABLE_MALLOC
вариант компиляции, вы можете использоватьFT_POINTER
тип поля для строки и других больших полей. Затем память будет выделена с использованиемmalloc()
из системной кучи.С
FT_CALLBACK
вместо того, чтобы выделять какую-либо память, вы получите обратный вызов, в котором вы сможете прочитать строку и обработать или сохранить ее любым удобным для вас способом. Например, если вы хотите записать строку на SD-карту, вы можете сделать это, даже не сохранив ее полностью в памяти.
В общем дизайне системы статическое распределение для максимального требуемого размера часто проще всего проверить. Если данные подходят один раз, они всегда будут соответствовать. Если вы идете на динамическое распределение, вам нужно будет более тщательно проанализировать, какое максимальное использование памяти требуется.