reinterpret_cast / C-style Cast



  • Hallo! ­čÖé

    Welche Variante sollte ich benutzen?

    Variante 1:

    std::vector< unsigned char > buffer ( new unsigned char[bufferSize] );
    SILLY_WINAPI_SAMPLE_STRUCT_PTR* sillySample = (SILLY_WINAPI_SAMPLE_STRUCT_PTR*) &buffer[0]; // Igit! C-style Cast!
    

    Variante 2:

    std::vector< unsigned char > buffer ( new unsigned char[bufferSize] );
    SILLY_WINAPI_SAMPLE_STRUCT_PTR* sillySample = reinterpret_cast<SILLY_WINAPI_SAMPLE_STRUCT_PTR*>(&buffer[0]); // Igit! reinterpret_cast!
    

    Ist beim reinterpret_cast sicher, dass der resultierende Zeiger auf die gleiche Speicheradresse, wie &buffer[0] zeigt? Habe mal gelesen, dass das nicht sicher ist - oder bezieht sich das nur auf einen wiederholten reinterpret_cast zur├╝ck auf den urspr├╝nglichen Typ?. ­čśĽ



  • Variante 2 ist v├Âllig OK.
    Simon



  • ich duck mich schonmal, aber ich hatte noch nie ein problem, nen normalen c-cast in c++ zu benutzen. benutze nie die *_cast templates.
    man sollte nat├╝rlich ein a nicht auf ein b kasten, wenn b von a ableitet.



  • esskar schrieb:

    aber ich hatte noch nie ein problem, nen normalen c-cast in c++ zu benutzen.

    Erinnert mich an undefiniertes Verhalten, das in 99% der F├Ąlle gut geht. In dem anderen 1% tritt es daf├╝r erst nach 5 Minuten Programmdurchlauf auf, ist absolut gar nicht rekonstruierbar und zerschreibt wichtigen Speicher, was man leider wiederum erst 10 Minuten sp├Ąter bemerkt. ­čÖé

    Ich pers├Ânlich finde die C++-Casts ├╝bersichtlicher, weil man gerade sieht, was gemacht wird. Die damit erhaltene Sicherheit w├Ąre mir allerdings allein schon deren Einsatz wert. Und die zus├Ątzliche Schreibarbeit nehme ich in Kauf, zumal Casts eher selten vorkommen.

    Das ist jedoch ein wenig Geschmackssache, im Forum gibt es auch viele Vertreter der C-Casts.



  • Nexus schrieb:

    Das ist jedoch ein wenig Geschmackssache, im Forum gibt es auch viele Vertreter der C-Casts.

    Im Gro├čen und Ganzen hat das Geschmack nicht einmal wirklich was zu tun. Meistens ist das eher pure Schreibfaulheit.



  • Gut, also reinterpret_cast. Danke!

    Ich dachte der reinterpret_cast sorgt nur daf├╝r, dass ein Zeiger auf einen Speicherbereich einfach als anderer Typ interpretiert wird. Der Zeiger aber bleibt.

    Nun hatte ich aber irgendwo gelesen, dass bei einem erneuten reinterpret_cast zur├╝ck auf den urspr├╝nglichen Typ nicht garantiert ist, dass der Zeiger immer noch auf den selben Speicher zeigt.

    int i = 1;
    SampleStruct* s = reinterpret_cast< SampleStruct* > &i;
    int* j = reinterpret_Cast< int* > s;
    
    // &i == j --> nicht definiert!
    


  • Roger W. schrieb:

    Nun hatte ich aber irgendwo gelesen, dass bei einem erneuten reinterpret_cast zur├╝ck auf den urspr├╝nglichen Typ nicht garantiert ist, dass der Zeiger immer noch auf den selben Speicher zeigt.

    Doch, ist. In der Tat ist das IIRC die einzige Garantie, die der Standard bez├╝glich der Verwendung von reinterpret_cast<> einr├Ąumt.


Log in to reply