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.


Anmelden zum Antworten