POD и наследование в C ++ 11. Имеет ли адрес struct == адрес первого члена?

(Я отредактировал этот вопрос, чтобы не отвлекать внимание. Есть один ключевой вопрос, который необходимо прояснить, прежде чем любой другой вопрос станет осмысленным. Извинения перед всеми, чей ответ сейчас кажется менее убедительным.

Давайте создадим конкретный пример:

struct Base {
    int i;
};

Не существует виртуальных методов и наследования, и, как правило, это очень глупый и простой объект. Следовательно, это Plain Old Data (POD) , и он возвращается к предсказуемому макету. В частности:

Base b;
&b == reinterpret_cast&(b.i);

Это соответствует Википедии (которая сама утверждает, что ссылается на стандарт C ++ 03):

Указатель на POD -struct объект, соответствующим образом преобразованный с использованием переинтерпретируемого преобразования, указывает на его начальный член и наоборот, подразумевая, что там - это не заполнение в начале POD-структуры.[8]

Теперь давайте рассмотрим наследование:

struct Derived : public Base {
};

Опять же, нет ни виртуальных методов, ни виртуального наследования, ни множественного наследования. Следовательно, это тоже POD.

Вопрос: Позволяет ли этот факт (Производное является POD в C ++ 11) сказать, что:

Derived d;
&d == reinterpret_cast&(d.i); // true on g++-4.6

Если это правда, то будет четко определено следующее:

Base *b = reinterpret_cast(malloc(sizeof(Derived)));
free(b); // It will be freeing the same address, so this is OK

Я не спрашивая здесь new и delete - проще считать malloc и свободными . Мне просто интересно узнать о правилах компоновки производных объектов в таких простых случаях, как этот, и где исходный нестатический член базового класса находится в предсказуемом месте.

Предполагается, что производный объект эквивалентен:

struct Derived { // no inheritance
    Base b; // it just contains it instead
};

без предварительного заполнения?

7
задан Aaron McDaid 15 January 2012 в 02:36
поделиться