Стандарт C++ устанавливает порядок для переменных-членов класса в памяти. В нем говорится, что адреса переменных-членов должны увеличиваться в порядке объявления, но только внутри одной секции доступа. В частности, это не мешает компиляторам размещать разделы доступа чередующимся образом. Например:
class X {
public:
int i;
int j;
private:
int k;
int n;
}
Позволяет ли стандарт компиляторам располагать элементы данных в порядке i, k, j, n? Это даст компиляторам некоторую (ограниченную) свободу в оптимизации макета объекта без нарушения стандарта.





И нет, я думаю, он НЕ пытается спамить. Это правильный вопрос и, я думаю, довольно интересный.
Хорошо, теперь я думаю, что компиляторы могут это сделать. Стандарт говорит в 9.2. p12:
Implementation alignment require-
ments might cause two adjacent members not to be allocated immediately after each other; so might
requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).
Я интерпретирую стандарт следующим образом: поскольку между i и j нет спецификатора доступа, адрес i должен стоять перед адресом j. Предлагаемый порядок соответствует этому. То же для k и n. Итак, в моей интерпретации компиляторы являются разрешили использовать этот порядок.
Я проверил стандарт C++. В разделе 9.2, абзаце (или пункте, или другом) 12, говорится: «Порядок распределения нестатических элементов данных, разделенных спецификатором доступа, не определен». «Не указано» означает поведение, зависящее от реализации, которое не нужно документировать.
Следовательно, в стандарте ничего не говорится о распределении, за исключением того, что i должно предшествовать j, а k должно предшествовать n. Следовательно, компилятору разрешено выделять ресурсы в порядке i, k, j, n, и ничего о порядке не требуется документировать.
Спасибо за ответ, это однозначно. Интересно, есть ли какие-нибудь компиляторы, которые используют эту возможность для уменьшения заполнения внутри объектов.