Сколько памяти используется «пропущенными необязательными» / «пустыми повторными» полями в ProtoBuf? - PullRequest
11 голосов
/ 28 декабря 2011

Я пытаюсь спроектировать мой первый формат файла в ProtoBuf, и я не уверен, какой из них лучше всего подходит в некоторых случаях, потому что расположение памяти / потока мне не совсем понятно.

Итак, у меня есть несколько вопросов, но все они тесно связаны:

1) Сколько стоит необязательное поле, если оно опущено?

Я думаю, что это должно стоить всего один бит , поскольку битовое поле может использоваться для пометки присутствующих / отсутствующих полей, но я точно не знаю. Вместо этого они могут использовать целый байт для каждого необязательного поля.

2) Сколько стоит повторное поле, когда оно пустое? Это также один бит, как необязательное поле, или это «заголовок поля» + один (varint) байт, чтобы сказать, что это размер 0?

3) Поскольку "байты" неявно имеют размер, действительно ли существует разница в размерах между отсутствующим необязательным полем байтов и пустым полем обязательных байтов?

[EDIT] Под «памятью» я понимал пространство, используемое в файловой системе или пропускной способности сети; Я не имел в виду оперативную память, поскольку это зависит от языка программирования.

1 Ответ

14 голосов
/ 28 декабря 2011

1: ничего вообще - полностью исключено на проводе

2: ничего вообще - включено только фактическое содержимое;пустой список по существу опущен (возможное исключение: пустые «упакованные» массивы; хотя даже это может быть законно опущено)

3: опущено ничего не стоит;текущая и нулевая длина не менее 2 байта - один заголовок поля (длина зависит от номера поля; младшие номера полей <32 занимают 1 байт) и одна длина нуля (один байт) </p>

Дополнительное примечание: protobuf никогда не использует суббайтовую упаковку, поэтому любое поле всегда использует целое число байтов.

(контекст: я написал реализацию protobuf из первых принципов, поэтому кодировка детали довольно знакомы мне)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...