Kostet ein Cast was?



  • Kostet der Laufzeit?



  • natürlich, wie sollte es denn gehen ohne rechenleistung zu benötigen?



  • Ich würde sagen, bis auf dynamic_cast findet das während des kompilierens statt.

    Der cast ist ja nur ein Mittel um den Compiler zu überzeugen, dass er etwas eigentlich syntaktisch falsches, trotzdem akzeptieren soll.



  • Original erstellt von DrGreenthumb:
    **Ich würde sagen, bis auf dynamic_cast findet das während des kompilierens statt.

    Der cast ist ja nur ein Mittel um den Compiler zu überzeugen, dass er etwas eigentlich syntaktisch falsches, trotzdem akzeptieren soll.**

    static_cast ist sicher nicht kompilerzeit....



  • reinterpret_cast kostet keinen Prozessortick mehr, static_cast ein wenig (oder auch viel, bei großen Klassen) und dynamic_cast am meisten, da zur Laufzeit erst noch die RTTI-Prüfung durchgeführt werden muss.

    ChrisM



  • Original erstellt von ChrisM:
    **reinterpret_cast kostet keinen Prozessortick mehr, static_cast ein wenig (oder auch viel, bei großen Klassen) und dynamic_cast am meisten, da zur Laufzeit erst noch die RTTI-Prüfung durchgeführt werden muss.

    ChrisM**

    das stimmt so nicht,
    wills du mir sagen das

    int main()
    {
        float a = 100.0
        int b = static_cast<int>( a );
    }
    

    was kostet?
    und

    int main()
    {
        float a;
        cin >> a;
        int b = reinterpret_cast<int>( a );
    }
    

    nix?



  • @Dimah: ChrisM hat vollkommen recht.



  • Genau das will ich sagen, Dimah. Ein static_cast kostet immer etwas, weil eine Konvertierung durchgeführt werden muss und ein reinterpret_cast ist genauso wie ein const_cast ohne Overhead (das soll aber nicht als Argument dienen, auch nur einen const_cast zu verwenden!!), weil er nur dazu dient, die Typsicherung des Compilers aufzuhebeln und den Compiler zu sagen, wie er die Daten interpretieren soll.

    ChrisM



  • So, ein Test von mir, der Code für die cout's ist bei reinterpret_cast genau gleich!

    1:    #include <iostream>
    2:
    3:    int main()
    4:    {
    00401560 55                   push        ebp
    00401561 8B EC                mov         ebp,esp
    00401563 83 EC 48             sub         esp,48h
    00401566 53                   push        ebx
    00401567 56                   push        esi
    00401568 57                   push        edi
    00401569 8D 7D B8             lea         edi,[ebp-48h]
    0040156C B9 12 00 00 00       mov         ecx,12h
    00401571 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
    00401576 F3 AB                rep stos    dword ptr [edi]
    5:        int test = 10;
    00401578 C7 45 FC 0A 00 00 00 mov         dword ptr [ebp-4],0Ah
    6:        void *test2 = &test;
    0040157F 8D 45 FC             lea         eax,[ebp-4]
    00401582 89 45 F8             mov         dword ptr [ebp-8],eax
    7:
    8:        std::cout << test << std::endl;
    00401585 68 C8 10 40 00       push        offset @ILT+195(std::endl) (004010c8)
    0040158A 8B 4D FC             mov         ecx,dword ptr [ebp-4]
    0040158D 51                   push        ecx
    0040158E B9 E0 67 47 00       mov         ecx,offset std::cout (004767e0)
    00401593 E8 67 FB FF FF       call        @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<< ) (004010ff)
    00401598 8B C8                mov         ecx,eax
    0040159A E8 46 FC FF FF       call        @ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<< ) (004011e5)
    9:        std::cout << reinterpret_cast<int>(test2) << std::endl;
    0040159F 68 C8 10 40 00       push        offset @ILT+195(std::endl) (004010c8)
    004015A4 8B 55 F8             mov         edx,dword ptr [ebp-8]
    004015A7 52                   push        edx
    004015A8 B9 E0 67 47 00       mov         ecx,offset std::cout (004767e0)
    004015AD E8 4D FB FF FF       call        @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<< ) (004010ff)
    004015B2 8B C8                mov         ecx,eax
    004015B4 E8 2C FC FF FF       call        @ILT+480(std::basic_ostream<char,std::char_traits<char> >::operator<< ) (004011e5)
    10:
    11:       return 0;
    004015B9 33 C0                xor         eax,eax
    12:   }
    004015BB 5F                   pop         edi
    004015BC 5E                   pop         esi
    004015BD 5B                   pop         ebx
    004015BE 83 C4 48             add         esp,48h
    004015C1 3B EC                cmp         ebp,esp
    004015C3 E8 58 EF 01 00       call        __chkesp (00420520)
    004015C8 8B E5                mov         esp,ebp
    004015CA 5D                   pop         ebp
    004015CB C3                   ret
    

    ChrisM



  • Aber was wird denn beim static_cast während der Laufzeit "konvertiert" ? Ich meine, entweder es lässt sich nicht compilieren und der Compiler beschwert sich, oder es lässt sich compilieren und es läuft, oder das Programm stürzt ab weil irgendwas total daneben war.

    Btw, das ganze ist völlig wurst, weil man eh immer dann castet wenn man's muss. Da gibts nix wo man überlegen könnte aus Geschwindigkeitsgründen darauf zu verzichten.



  • bevor du dynamic_castest solltest du dir auch im klaren sein, wieso und vielleicht dein design neu überdenken.
    damit will ich nicht sagen, dass dynamic_cast sinnlos ist. man sollte es sich nur genau überlegen!



  • sekunde!
    warum soll Dimah unrecht haben?
    ein cast kostet nichts (es sei denn der cast Operator ist überladen worden und dort wird code ausgeführt) aber führ builtings kostet es nix.

    warum? weil ein type nur auf C++ ebene existiert!
    Ob cout einen char als char oder als int interpretiert steht bereits zur compile Time fest. (deshalb gibt es auch die Meldung: 'kein überladener operator<< für xxx')



  • @davie

    man sollte es sich nur genau überlegen!

    soll man das nicht immer machen, bevor man castet? 🙄 Ich seh eigentlich keinen Grund dynamic_cast nicht zu benutzen, weil der dynamic_cast sicher ist, falls etwas daneben geht, erhalte ich eben NULL. Natürlich kostet das was.



  • Original erstellt von Shade Of Mine:
    warum? weil ein type nur auf C++ ebene existiert!
    Ob cout einen char als char oder als int interpretiert steht bereits zur compile Time fest. (deshalb gibt es auch die Meldung: 'kein überladener operator<< für xxx')

    ok jetzt hab ich folgenden code:

    float f = 1/rand();
    std::cout << static_cast<int>(f) << std::endl;
    

    irgendwie muss der float doch in den int konvertiert werden... und da der wert des floats zur kompilerzeit noch nicht feststeht kostet er auch was...

    [ Dieser Beitrag wurde am 19.04.2003 um 11:43 Uhr von japro editiert. ]



  • warum? weil ein type nur auf C++ ebene existiert!
    Ob cout einen char als char oder als int interpretiert steht bereits zur compile Time fest. (deshalb gibt es auch die Meldung: 'kein überladener operator<< für xxx')

    Richtig, aber wenn du z.B. einen float einfach als int interpretierst, hast du eine komplett andere Zahl. Der static_cast sorgt dafür, dass der float nach int konvertiert wird, also z.B. Nachkommastellen abgeschnitten werden.

    ChrisM



  • 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.


Anmelden zum Antworten