Ist C ++ -Wert garantiert?

8

Ü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%     
CiscoIPPhone 02.12.2010, 21:44
quelle

3 Antworten

3

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:

  • entweder gibt es keine Hierarchie (keine virtuelle) und dann können Sie die Adresse von Objekten vergleichen wie
  • oder es gibt eine Hierarchie (und eine virtuelle Methode) und Sie verwenden 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)

    
Matthieu M. 03.12.2010, 07:54
quelle
2

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.

    
Crazy Eddie 02.12.2010 21:48
quelle
2

Ja, ist es.

Der Zeiger von f ist derselbe und wird an f::equalPointer ...

übergeben     
peoro 02.12.2010 21:48
quelle

Tags und Links