7 Stimmen

PODs und Vererbung in C++11: Ist die Adresse der Struktur == Adresse des ersten Mitglieds?

(Ich habe diese Frage bearbeitet, um Ablenkungen zu vermeiden. Es gibt eine Kernfrage, die geklärt werden muss, bevor eine andere Frage Sinn macht. Ich entschuldige mich bei allen, deren Antwort jetzt weniger relevant erscheint).

Schauen wir uns ein konkretes Beispiel an:

struct Base {
    int i;
};

Es gibt keine virtuellen Methoden und keine Vererbung, und es ist im Allgemeinen ein sehr stummes und einfaches Objekt. Daher ist es Einfache alte Daten (POD) und er greift auf ein vorhersehbares Layout zurück. Im Besonderen:

Base b;
&b == reinterpret_cast<B*>&(b.i);

Dies ist laut Wikipedia (das selbst behauptet, auf den C++03-Standard zu verweisen):

Ein Zeiger auf ein POD-struct-Objekt, der mit einem Re-Interpret-Cast entsprechend umgewandelt wurde, zeigt auf sein Anfangsglied und umgekehrt, was bedeutet, dass es am Anfang eines POD-struct kein Padding gibt.[8]

Betrachten wir nun die Vererbung:

struct Derived : public Base {
};

Auch hier gibt es keine virtuellen Methoden, keine virtuelle Vererbung und keine Mehrfachvererbung. Daher ist auch dies POD.

Frage: Erlaubt uns diese Tatsache (Derived ist POD in C++11) zu sagen, dass:

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

Wenn dies wahr ist, dann wäre das Folgende wohldefiniert:

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

Ich frage nicht nach new y delete hier - es ist einfacher, die malloc y free . Ich bin nur neugierig auf die Vorschriften über das Layout von abgeleiteten Objekten in einfachen Fällen wie diesem, und wo die anfängliche nicht-statische Mitglied der Basisklasse ist in einem vorhersehbaren Ort.

Soll ein abgeleitetes Objekt gleichwertig sein mit:

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

ohne vorheriges Auffüllen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X