Kostet ein Cast was?



  • Ist doch egal welcher Wert sich hinter der Variable versteckt. Letztendlich müssen doch nur die Bytes hin und hergeschoben werden.
    Und mit dem Cast sagt man halt dem Compiler, das er es erlauben soll.



  • float f = 1.23f;
    004322FE  mov         dword ptr [f],3F9D70A4h 
        int i = static_cast<int>(f);
    00432305  fld         dword ptr [f] 
    00432308  call        @ILT+7755(__ftol2) (42FE50h) <-- hier wird noch ne konvertierungsfunktion aufgerufen
    0043230D  mov         dword ptr [i],eax
    


  • reinterpret_cast bildet Bitmuster auch nicht zwingend Eins zu Eins ab; darum läuft er auch nicht unbedingt in konstanter Zeit ab.

    Irgendwie verwirrt mich dieser Thread. Was ist eigemtlich das derzeitige Thema?



  • aeh nur mal so ne zwischenfrage:
    wen interessiert das, ob der cast was kostet?!
    😮 😕 🙄



  • Warum schmeissen die nicht einfach den static_cast raus und bieten dafür Umwandelfunktionen a la FloatToInt etc. Das wär doch viel schicker.



  • Original erstellt von <Lars@not@home>:
    Warum schmeissen die nicht einfach den static_cast raus und bieten dafür Umwandelfunktionen a la FloatToInt etc. Das wär doch viel schicker.

    Eine Funktionsaufruf kostet doch viel mehr, als ein cast.

    Allein, wenn ich hier komplett ohne Optimierung arbeite (g++ -O0 -S main.cpp) kann ich einen Unterschied im Assember feststellen, der durch den static_cast<int>(f) verursacht wird.

    Hier der Unterschied im Assemblat (wer sich über die Mnemonics wundert: PowerPC Assembler):

    ...
            lfs f0,32(r30)
            fctiwz f0,f0
            stfd f0,40(r30)
            lwz r0,44(r30)
    ...
    

    Sobald auch nur die geringste Optimierungseinstellung (-O1 oder höher) des Compilers verwendet wird, sind keine Unterschiede im Assemblat mehr auszumachen.



  • Die C++ Casts haben ja auch die Form eines Funktionaufrufs, das heisst ja nicht das tatsächlich eine aufgerufen wird.



  • Warum schmeissen die nicht einfach den static_cast raus und bieten dafür Umwandelfunktionen a la FloatToInt etc. Das wär doch viel schicker.

    Die vom Standardcomitee versuchen immer möglichst wenig Bezeichner fest in die Sprache zu integrieren.

    static_casts kosten natürlich was. Viele Coder in Zeitkritischen bereichen (DSP, ...) schreiben plattformspezifischen Assemblercode statt static_cast zu verwenden.

    Der reinterpret_cast kostet je nachdem auch was. Es sei denn man verwendet einen Aufruf wie reinterpret_cast<int&>(foo).



  • kostet static_cast IMMER was? kommt doch auch auf den fall an, oder?



  • generell: chrisM hat recht.
    Peter: ich wuerde sagen, static cast kostet nur dann nix, wenn man um von dem einen zum anderen typ zu kommen, die bits nicht umordnen muss.

    int i=0;
    int a = static_cast<int>(i);
    

    sollte zum beispiel nix kosten. mit unsigned vermutlich auch nich. aber aussagen ueber bitmuster sind nicht portabel. man koennte sich bestimmt auch einen rechner ausdenken, wo abhaengig von der aktuellen adresse bitmuster verschieden interpretiert werden, dann kosten casts immer was.


Anmelden zum Antworten