2013-07-09 5 views
3

В типичном C или C++ struct разработчик должен явно упорядочить элементы данных таким образом, чтобы обеспечить эффективное выравнивание и заполнение памяти, если это проблема.Будут ли протокольные буферы Google автоматически выравнивать данные?

Буферы протокола Google ведут себя так же, как struct, и неясно, как их компиляция влияет на макет памяти. Кто-нибудь знает, будет ли эта тенденция упорядочивать данные в определенном порядке ради эффективного макета памяти автоматически обрабатывается компилятором буфера протокола? Я не смог найти информацию об этом.

I.E. буфер может фактически внутренне упорядочить данные по-разному, чем это указано в объекте message протобуфа.

+0

Я удалил теги C# и protobuf-net, потому что я не верю, что вопрос применим к ним. Интересный вопрос, хотя –

+0

@MarcGravell фактически protobuffs на самом деле используются в C# и .net регулярно, поэтому я добавил теги – johnbakers

+1

Err, protobufs - это формат проводов, а не формат памяти. Вопрос не имеет смысла. – EJP

ответ

1

В типичной структуре C или C++ разработчик должен явно упорядочить элементы данных таким образом, чтобы обеспечить эффективное выравнивание и заполнение памяти, если это проблема.

На самом деле это не совсем так.

Это правда, что большинство компиляторов (на самом деле все, что мне известно) имеют тенденцию выравнивать элементы структуры в машинных словах. Они делают это из-за соображений производительности, потому что обычно дешевле читать с адреса слова и просто маскировать несколько бит, чем читать с адреса слова, сдвигать слово, поэтому значение, которое вы ищете, выровнено по правому краю, а маска бит не нужен. (Конечно, это зависит от архитектуры, которую вы компилируете)

Итак, почему ваше утверждение, которое я цитировал выше, не соответствует действительности? - Из-за того, что компиляторы упорядочивают элементы, как описано выше, они также предлагают программисту возможность усугубить это поведение. Обычно это делается с использованием специальной справки для компилятора.

Например, компиляторы GCC и MS C предоставляют pragma called "pack", что позволяет программисту изменять поведение выравнивания компилятора для конкретных структур. Конечно, если вы решите установить пакет на «1», использование памяти будет импровизировано, но это, возможно, повлияет на ваше поведение во время выполнения.

Что никогда не случается, насколько я знаю, это переупорядочение членов в структуре компилятором.

+0

Точно. Именно поэтому мне интересно, как структура данных goob protobuf, которая представляет собой двоичный формат, предназначенный для повышения эффективности, перестраивает участников, тем самым улучшая опыт разработчика и предлагая одно из преимуществ использования protobuf. – johnbakers

+0

Буферы протокола OpenLearner - это своего рода универсальный формат контейнера для пересылки информации взад и вперед. Это анализируется и создается с использованием библиотек буферов протоколов. После разбора полученного блоба связь между структурой данных на проводе и структурой, имеющейся у вас в памяти, отсутствует. Поэтому я боюсь, что у меня не возник вопрос ... – junix

+0

Буферы протокола Google, похоже, доступны без создания собственной дополнительной структуры времени выполнения, поэтому я не понимаю ваш комментарий. Я имею в виду макет данных в памяти, когда скомпилированный буфер протокола загружается программой. Вы можете напрямую обращаться к содержимому буфера. – johnbakers

Смежные вопросы