Überlegen Sie, ich habe eine Klasse Foo (die ihren & amp; -Operator nicht überladen hat) ist die Adresse, die von & amp; Der Operator dieser Klasse hat garantiert denselben Wert wie sein this
-Zeiger?
Im folgenden Code wird equalPointer garantiert, um wahr zurückzugeben? Gibt es Fälle, in denen es falsch zurückgegeben werden könnte (z. B. wenn Mehrfachvererbung in Betracht gezogen wird)?
%Vor%Das Problem besteht im Speicherlayout. Der Standard garantiert nicht viel über das Speicherlayout, insbesondere garantiert er nicht, dass zwischen einer abgeleiteten und einer Basisklasse kein Offset existiert ...
Zum Beispiel:
%Vor% Da boost::noncopyable
keine Methode virtual
hat, werden in gcc (void*)(Foo*)&f
und (void*)(boost::noncopyable*)&f
unterschiedliche Werte haben.
Aber das ist in der Praxis nicht so wichtig, weil der Compiler die notwendigen Anpassungen vornehmen wird. Das heißt, wenn Sie nur Foo*
vergleichen, sollten Sie gut und gut sein ...
... Abgesehen davon, dass die mehrfache Vererbung dieses Problem lösen könnte, wenn mehrere Foo
-Unterobjekte in Ihrer Hierarchie vorhanden sind.
Auf der anderen Seite sollten Sie sich in einem von zwei Fällen befinden:
dynamic_cast<void*>(&f)
, um die Adresse des vollständigen Objekts zu erhalten. Als Template-Methode würde dies also bedeuten:
%Vor%(das ist nur gültig, wenn sowohl T als auch U virtuelle Methoden haben)
Mit dem Code in Frage? Ja.
Gibt es Konstrukte, in denen das nicht so ist? Auch ja.
Aber ja, ein Zeiger auf eine Instanz der Klasse X wird immer gleich dem 'this' Zeiger innerhalb der Klasse X sein. Dasselbe kann nicht für seine Basisklassen oder abgeleiteten Klassen gesagt werden.