Это большой вопрос, поэтому я прошу справку, а не ответ размером с буклет. Я прохожу экскурсию по C ++ по Страуструпу, и кажется, что расположение объектов — это то, что память имеет фундаментальное значение для проектирования многих функций C ++, например. PODs против агрегатов против классов с виртуальными членами.
К сожалению, сам Тур не охватывает этот предмет подробно, и просмотр ToC некоторых стандартных ссылок, таких как C ++ Primer 5ed и TCPPPL 4ed, не показывает, покрывают ли они это или нет.
Нестатические члены данных (не объединяющего) класса с одинаковым контролем доступа распределяются таким образом, чтобы более поздние члены имели более высокие адреса в объекте класса. Порядок распределения нестатических элементов данных с различным контролем доступа не определен. Требования выравнивания реализации могут привести к тому, что два смежных элемента не будут выделяться сразу после друг друга; то же самое касается требований к пространству для управления виртуальными функциями и виртуальными базовыми классами.
а также [Class.mem] / 25:
Если объект класса стандартной компоновки имеет какие-либо нестатические элементы данных, его адрес совпадает с адресом его первого нестатического члена данных. В противном случае его адрес совпадает с адресом его первого подобъекта базового класса (если есть). [ Заметка: Поэтому в объекте структуры стандартной компоновки может быть безымянный отступ, но не в его начале, что необходимо для достижения соответствующего выравнивания. — конец примечания] [Примечание: Объект и его первый подобъект являются взаимозаменяемыми по указателю ([basic.compound], [expr.static.cast]). — конец примечания]
Существует также [Dcl.array] что указывает на то, что массивы непрерывны в памяти, [Class.bit] который говорит о битовых полях, и [Intro.object] который говорит о размере объекта и концепции перекрывающихся подобъектов.
Там могут быть и другие места. Там нет ни одного места.
Других решений пока нет …