В типичной структуре C или C++ разработчик должен явно упорядочить элементы данных таким образом, чтобы обеспечить эффективное выравнивание и заполнение памяти, если это проблема.
На самом деле это не совсем так.
Это правда, что большинство компиляторов (на самом деле все, что мне известно) имеют тенденцию выравнивать элементы структуры в машинных словах. Они делают это из-за соображений производительности, потому что обычно дешевле читать с адреса слова и просто маскировать несколько бит, чем читать с адреса слова, сдвигать слово, поэтому значение, которое вы ищете, выровнено по правому краю, а маска бит не нужен. (Конечно, это зависит от архитектуры, которую вы компилируете)
Итак, почему ваше утверждение, которое я цитировал выше, не соответствует действительности? - Из-за того, что компиляторы упорядочивают элементы, как описано выше, они также предлагают программисту возможность усугубить это поведение. Обычно это делается с использованием специальной справки для компилятора.
Например, компиляторы GCC и MS C предоставляют pragma called "pack", что позволяет программисту изменять поведение выравнивания компилятора для конкретных структур. Конечно, если вы решите установить пакет на «1», использование памяти будет импровизировано, но это, возможно, повлияет на ваше поведение во время выполнения.
Что никогда не случается, насколько я знаю, это переупорядочение членов в структуре компилятором.
Я удалил теги C# и protobuf-net, потому что я не верю, что вопрос применим к ним. Интересный вопрос, хотя –
@MarcGravell фактически protobuffs на самом деле используются в C# и .net регулярно, поэтому я добавил теги – johnbakers
Err, protobufs - это формат проводов, а не формат памяти. Вопрос не имеет смысла. – EJP