Konstante Variablen schneller?



  • Hi,
    ich wollte mal wissen, ob Variablen, die als "const" definiert sind in C/C++ schneller sind bzw. ob die CPU damit dann schneller rechnen kann?
    Vielleicht weil sie dann anders im Cache gelagert werden?!



  • "Konstante Variablen"?


  • Mod

    Nicht zwangsläufig. Aber const Variablen erlauben dem Compiler oft, Optimierungen vorzunehmen, die sonst nicht möglich wären. Ein einfaches Beispiel ist eine globale Konstante, die wie ein Literal behandelt werden kann.



  • LukasBanana schrieb:

    ich wollte mal wissen, ob Variablen, die als "const" definiert sind in C/C++ schneller sind bzw. ob die CPU damit dann schneller rechnen kann?

    Es ist prinzipiell möglich, vor allem bei Werten, die zur Kompilierzeit feststehen:

    const double pi = 3.14159265;
    double degree = 180 / pi * radian; // hier dürfte die Division wegoptimiert werden
    

    Aber im Allgemeinen werden sich die Performancegewinne durch const stark in Grenzen halten. Komplett abwegig wäre es, deswegen überall const zu platzieren, wo es möglich ist. Zur Optimierung gibt es nahezu immer geeignetere Ansätze.

    seldon schrieb:

    "Konstante Variablen"?

    Ich habe kein Problem mit dem Begriff. Man muss eben von der wörtlichen Interpretation wegkommen und in Betracht ziehen, dass "Variable" im Umfeld der Programmierung primär für Behälter von Daten verwendet wird. Wirklich daneben ist hingegen die "konstante Referenz".



  • @Nexus:
    Also ich schreibe mittlerweise fast überall "const" hin wo man nur "const" hinschreiben kann 🙂 Aber mehr weil ich die zusätzliche Information gut finde, nicht wegen der möglicherweise besseren Optimierbarkeit.

    @LukasBanana:
    "const" auf integralen Typen bringt schon oft was, da der Compiler das durchaus zum Optimieren verwendet.



  • hustbaer schrieb:

    @Nexus:
    Also ich schreibe mittlerweise fast überall "const" hin wo man nur "const" hinschreiben kann 🙂 Aber mehr weil ich die zusätzliche Information gut finde, nicht wegen der möglicherweise besseren Optimierbarkeit.

    Wenn es tatsächlich zur Semantik beiträgt, tue ich das auch. Aber es gibt massenhaft Stellen im Code, wo man sinnlos const einfüllen könnte. Man sollte auch bedenken, dass mit unbedachtem Einstz wichtige Dinge weniger schnell erkannt werden.

    Beispiel:

    const int func(const int a);
    


  • Da hier by-value übergeben wird, ist ein const an dieser Stelle auch tatsächlich vollkommen sinnlos. hustbaer wird wohl nur überall dort const einsetzen wo es auch Sinn macht, dann aber immer. Und zwar immer.

    MfG SideWinder



  • Bei Parametern mache ich nie top-level const.
    Dafür bei lokalen Variablen sehr oft:

    void foo()
    {
        lala l = bar();
        int const type = l.getType(); // wenn wir's nie ändern, können wir das dem leser auch gleich hier mitteilen
    
        // 100 andere dinge
    
        baz(type); // damit er z.B. hier weiss, dass es immer noch der wert von ganz oben ist
    }
    


  • Nexus schrieb:

    const double pi = 3.14159265;
    double degree = 180 / pi * radian; // hier dürfte die Division wegoptimiert werden
    

    Wenn pi innerhalb der Funktion nicht verändert wird, wird ein guter Compiler auch optimieren und die Division zur Compilezeit auflösen.



  • Solche Zeilen habe ich auch schon gesehen...

    const char* const  funktion( const char* const p ) const;
    


  • Wiederrum: Der Pointer selbst wird by-value übergeben, die beiden zusätzlichen const haben also keinen Sinn. Da es sich um eine Funktion und keine Member-Methode handelt ist das const am Ende ohnehin falsch.

    Korrekt also:

    const char* foo (const char* p);
    

    MfG SideWinder



  • @all: Danke für eure Antworten 🙂

    @Nexus: warum ist eine "konstante Referenz" daneben?
    Folgendes Beispiel ist doch eine "konstante Referenz", aber nicht sinnlos oder?

    void Func(const MyClass &Param);
    
    // oder
    
    /* Damit X, Y und Z Komponenten von "Vector3D" nicht alle kopiert werden müssen, sondern nur die Reference übergeben wird. */
    Vector3D Multiply(const Vector3D &A, const Vector3D &B);
    
    // Da die Referenz konstant ist, kann man dann auch schreiben:
    
    Vector3D NewVec = Multiply(Vector3D(0, 1, 2), Vector3D(4.5, 2, 7.2));
    

    Würde es sich nicht um eine konstante Referenz handeln ginge folgender Code nicht:

    Vector3D Multiply(Vector3D &A, Vector3D &B)
    Multiply(Vector3D(0, 1, 2), Vector3D(4.5, 2, 7.2)); // Geht nicht
    

    Gruß,
    Lukas

    (PS: Nein ich programmiere nicht mit einer .NET Sprache, auch wenn ich in Code Beispielen immer gerne "My" an Klassen Namen hänge um zu verdeutlichen, dass es eine von mir ist ^^)



  • LukasBanana schrieb:

    ich wollte mal wissen, ob Variablen, die als "const" definiert sind in C/C++ schneller sind bzw. ob die CPU damit dann schneller rechnen kann?

    Da Du per const versprichst, die "Variable" nicht zu verändern und ein Versuch, sie doch zu verändern, undefiniertes Verhalten hervorruft, darf ein Compiler bei Verwendung solcher Variablen Constant Folding durchführen. Beispiel:

    void func(double);
    
    const double foo = 2.2;
    const double bar = 9.3;
    
    int main() {
      func(foo*std::cos(bar));
    }
    

    Der GCC generiert hieraus direkt so etwas wie

    int main() {
      func(-2.18289571599573);
    }
    

    weil er die Werte von foo und bar schon zur Compile-Zeit kennt und auch von std::cos weiß, dass es sich um den Kosinus handelt -- der Wert ist also nicht von irgendwelchen anderen Zuständen abhängig. Der GCC verwendet hierzu intern eine Bibliothek, die solche Werte sehr genau während des Kompilierens ausrechnen kann.



  • LukasBanana schrieb:

    @Nexus: warum ist eine "konstante Referenz" daneben?

    Es ging mir um den Begriff. Du scheinst auch zu den Leuten zu gehören, die leichtsinnig "konstante Referenz" sagen, ohne zu wissen, dass das eigentlich falsch bzw. ohne Aussagekraft ist. Eine Referenz ist immer konstant, und zwar per Definition. Worauf sich das const bezieht, ist das referenzierte Objekt und nicht die Referenz selber. Ich würde eher "Const-Referenz" oder "Referenz auf const " sagen.

    Ist vielleicht eine Spitzfindigkeit, aber ich finde es wichtig, bei solchen Begriffen präzise zu sein. Besonders wenn man Anfängern etwas erklären will, kann es sich auszahlen, von Anfang an eine konsistente Terminologie zu verwenden.



  • hustbaer schrieb:

    Bei Parametern mache ich nie top-level const.

    Was bedeutet top-level-const ?



  • Dweb schrieb:

    Was bedeutet top-level-const ?

    Dass die oberste "Typ-Ebene" const -qualifiziert ist, also das eigentliche Objekt.

    T* const ptr;  // const bezieht sich auf Zeiger T*, Top-Level
    
    T const* ptr;  // const bezieht sich auf das referenzierte Objekt
    const T* ptr;  // T, also eine Indirektion mehr -> nicht Top-Level
    
    const T** ptr; // Hier erst recht nicht
    
    T& ref = ...;  // Referenzen sind implizit konstant, aber NICHT const-
                   // qualifiziert, da sie keine Objekte sind.
    
    T const obj;   // Beliebiges Objekt mit Top-Level const.
    const T obj;   // T kann auch U* sein (wobei U ein anderer Objekttyp ist).
    

Anmelden zum Antworten