pointer nach referenz casten



  • Hallöchen,

    wenn man einen Pointer auf ein Objekt hat, aber die Referenz
    auf das Objekt braucht, kann man dann einfach den Pointer als
    Referenz casten (d.h. die Referenz ist dann einfach die Adresse
    die im Pointer steht)? Wie z.B. hier:

    void A(obj &o)
    {
     ...
    }
    
    void B(obj *o)
    {
      A((obj&)o);
    }
    

    Oder muss man immer dereferenzieren?

    void A(obj &o)
    {
     ...
    }
    
    void B(obj *o)
    {
      A(*o);
    }
    

    Wenn beides geht, ist die erste Version
    mit dem Casten schneller, weil dort das
    dereferenzieren wegfällt?

    Danke!
    Gruß gast_45



  • Die zweite Variante ist richtig. Die Referenz ist so zu behandeln als wenn Du das Originalobjekt in der Hand hättest. (Im Hintergrund ist es das Originalobjekt.)

    Ob das erste Beispiel funktionieren könnte weiß ich nicht. Wenn doch dann hast Du auf jeden Fall die Dereferenzierung vergessen.

    void B(obj *o) {
      A((obj&)*o);
    }
    

    Also auf jeden Fall dereferenzieren.



  • Die erste Version ist semantisch falsch: Du versuchst einen Zeiger auf ein Objekt als einen Wert dieses Objektes aufzufassen und eine Referenz darauf zu bekommen. Das müsste hier zwar abhängig vom Typ manchmal gehen (mit reinterpret_cast bzw. einem C-Style-Cast), aber ist nicht das was du willst. Es bleibt dir nichts anderes übrig als zu dereferenzieren. Glücklicherweise ist das Dereferenzieren eines Zeigers eine Operation, die auf Maschinenebene keine Entsprechung hat, es kostet also nichts.
    Erst der spätere Zugriff auf den Wert kostet etwas, aber auch da macht es keinen Unterschied, ob du über die Referenz oder über den Zeiger gehst. Wenn es nicht unterschiedliche Rahmenbedingungen für die Optimierung gäbe, könnte man erwarten, dass Referenzen und Zeiger sich in identischem Maschinencode niederschlagen.



  • danke!!



  • ich dachte halt das eine referenz auf ein objekt
    im prinzip nichts anderes ist als ein pointer
    auf ein objekt (beide tragen die adresse des objekts).
    und das ich deswegen vielleicht auch einfach den
    pointer als referenz casten könnte. na ja offensichtlich
    ist eine referenz doch nicht einfach nur eine speicheradresse
    wie sie in einem pointer liegt?



  • Hallo

    Technisch gesehen sind Referenzen und Pointer dasselbe, es kommt der gleiche Maschinencode raus. Beide bestehen selber nur aus einer Speicheradresse. Aber syntaktisch und semantisch unterscheiden sie sich.

    bis bald
    akari


Anmelden zum Antworten