Иногда компиляторы C++ генерируют разные макеты памяти для одного и того же типа T в одном и том же двоичном файле. А именно, это происходит, когда объекты возникают как в несмежном подобъект класса, а в качестве отдельного объекта или массива подобъекта:Различные макеты для одного и того же типа в одном двоичном файле
struct A { int i; };
struct B : virtual A { int i; };
struct C : virtual A { int i; };
struct D : B,C { int i; };
...
D d;
B b;
B* p1= &(B&)d;
B* p2= &b;
В соответствии с С ++ 14 стандартного, это компилятор свободно генерировать любой количество различных макетов для объектов типа T в одном бинарном файле? Являются ли макеты памяти фиксированными во время компиляции?
Выделения: How does placement new know which layout to create?
Разработка на второй вопрос: Объект т типа Т могут быть доступны либо Т *, либо символ * указателей. (Последнее оправдано §3.10 (10)). После того как скомпилированная программа запущена, можно определить относительные смещения подобъектов t, обратившись к t через указатели char. Являются ли эти смещения детерминированными или могут ли они меняться от одного выполнения программы к другому?
Не могли бы вы рассказать о своем вопросе? Что вы подразумеваете под * Являются ли макеты памяти фиксированными во время компиляции *? –