Konstaten wirklich invariabel?



  • Ich finde die philosophisch anmutende Diskussion, ob Konstanten konstant oder nur abstrakt konstant sind, nicht sonderlich hilfreich.

    Der TE hat Probleme bei der sematischen Interpretation von i von i + 1. Er ist also noch etwas unerfahren in C++.

    Und nun sieht er, wie sich ein Forum darüber streitet, ob const int konstant ist oder nicht. Warum sollte er da nicht denken: "Wenn das Forum nicht weis, ob const int konstant ist oder nicht, warum sollte ich dann überhaupt const nutzen?"

    Und das würde dazu führen, dass der TE ein meines Erachtens wichtiges Hilfsmittel nicht nutzt. Ein Hilfsmittel welches ausdrückt: Lieber Entwickler es ist von mir nicht angedacht die Variable/Parameter zu ändern. Solltest du nach Seiteneffekten wg. Parametern suchen, so habe ich den Parameter nicht verändert...

    PS:
    Ironischerweise hat in der Embedded Welt const irgentwie seine ursprüngliche Bedeutung verloren. Bei einigen MCU's landen static const im FLASH ROM. Bei gesetzten Lock Bits und vergossenem Programmierport kann man danach gar nichts mehr ändern.

    https://community.st.com/s/question/0D50X00009XkY1qSAF/store-constant-variables-in-flash
    https://stackoverflow.com/questions/54532302/static-const-vs-const-declaration-performance-difference-on-uc

    Das Ganze ist offenbar so verbreitet, das bei einigen Entwickler der Gedanke "const = ROM" aufkam und dadurch vermutlich Mempory Specifier wie PROGMEM eingeführt wurden.

    https://www.nongnu.org/avr-libc/user-manual/pgmspace.html


  • Mod

    @Quiche-Lorraine sagte in Konstaten wirklich invariabel?:

    PS:
    Ironischerweise hat in der Embedded Welt const irgentwie seine ursprüngliche Bedeutung verloren. Bei einigen MCU's landen static const im FLASH ROM. Bei gesetzten Lock Bits und vergossenem Programmierport kann man danach gar nichts mehr ändern.

    War das überhaupt jemals seine Bedeutung? Nach allem was ich weiß (und das ich auch gerade noch einmal bestätigt habe), hat das Konzept von const-Variablen seinen Ursprung in High-Level Programmiersprachen (tatsächlich wird sogar oft auf C++ als ersten Vertreter verwiesen). Das heißt, es gab niemals eine low-level Beziehung zu irgendeiner Hardwarespezialität (wie es z.B. bei register oder volatile ist), sondern es war stets nur auf Hochspachenebene als Hilfsmittel für den Programmierer gedacht, damit die invarianten der Programmlogik nicht versehentlich verletzt werden können.

    Das kann man historisch auch daran sehen, dass "echte" Konstanten in historischem C89 durch Makros erreicht wurden, nicht etwa durch const int, welches nicht als Compilezeitkonstante galt. Wenn irgendetwas wirklich eine Konstante für den ROM (oder auch eine geschützte Speicherseite für Programmcode) war, dann hätte man es als Literal oder Makro in den Quellcode getan und gehofft, dass der Compiler den Wert dann auch fest in das Maschinenprogramm einfügt. Was er dann auch getan hat. Bei einem const int hätte hingegen durchaus eine gute Chance bestanden, dass dieser bei unoptimierten Code wirklich irgendwo auf dem Stack liegt.



  • @SeppJ sagte in Konstaten wirklich invariabel?:

    es war stets nur auf Hochspachenebene als Hilfsmittel für den Programmierer gedacht

    Viel mehr wollte ich auch gar nicht beitragen, vor allem da mir die Intention komplett unklar ist.



  • Nein, Konstanten sind nicht invariabel.

    In C++ sind die im Gegensatz zu C invariabel. Ein Lesezugriff wird immer zur Compile-Zeit "geerdet".
    Du kannst zwar das const per const_cast wegcasten und der Compiler darf theoretisch die Variable dann ins Binary nehmen und dort auch schreiben, aber er darf auch den Schreibzugriff wegoptimieren. MSVC und g++ tun das entsprechend, clang tut das nicht.


  • Mod

    Wenn du glaubst, hier gäbe es irgendwelche Unterschiede zwischen C und C++, dann ist schon deine Eingangsannahme komplett falsch.



  • @SeppJ sagte in Konstaten wirklich invariabel?:

    Wenn du glaubst, hier gäbe es irgendwelche Unterschiede zwischen C und C++, dann ist schon deine Eingangsannahme komplett falsch.

    Doch, hier gibt es einen Unterschied zwischen C und C++. Weil in C const-Werte nicht immer compile-time-konstant sind nutzt man ja #define's für Konstanten. In C++ ist das nicht mehr nötig.



  • Wo ist da die compile-time-konstante?

    void func(const int x)
    {
        std::cout << x;
    }
    
    int main()
    {
        int y;
        if(std::cin >> y)
        {
            func(y);        
        }
    }
    

  • Mod

    @Flodul sagte in Konstaten wirklich invariabel?:

    @SeppJ sagte in Konstaten wirklich invariabel?:

    Wenn du glaubst, hier gäbe es irgendwelche Unterschiede zwischen C und C++, dann ist schon deine Eingangsannahme komplett falsch.

    Doch, hier gibt es einen Unterschied zwischen C und C++. Weil in C const-Werte nicht immer compile-time-konstant sind nutzt man ja #define's für Konstanten. In C++ ist das nicht mehr nötig.

    Das ist ein rein syntaktischer Unterschied.



  • @LeMace sagte in Konstaten wirklich invariabel?:

    Wo ist da die compile-time-konstante?

    void func(const int x)
    {
        std::cout << x;
    }
    
    int main()
    {
        int y;
        if(std::cin >> y)
        {
            func(y);        
        }
    }
    

    Nirgends. Und ...?



  • @LeMace sagte in Konstaten wirklich invariabel?:

    Wo ist da die compile-time-konstante?

    void func(const int x)
    {
        std::cout << x;
    }
    
    int main()
    {
        int y;
        if(std::cin >> y)
        {
            func(y);        
        }
    }
    

    Ne, da nicht. Aber wenn Du sowas schreibst wie
    int const abc = 123;
    dann kannst Du das const beliebig wegcasten und darauf schreiben - ein Lesezugriff darauf bleibt immer konstant (und der Schreibzugriff wird i.d.R. wegoptimiert).


  • Mod

    @Flodul sagte in Konstaten wirklich invariabel?:

    Ne, da nicht. Aber wenn Du sowas schreibst wie
    int const abc = 123;
    dann kannst Du das const beliebig wegcasten und darauf schreiben - ein Lesezugriff darauf bleibt immer konstant (und der Schreibzugriff wird i.d.R. wegoptimiert).

    Wenn du das gleiche Programm mit einem C-Compiler übersetzt, passiert aber dasselbe.



  • @Flodul sagte in Konstaten wirklich invariabel?:

    dann kannst Du das const beliebig wegcasten und darauf schreiben

    ... und hast damit UB.



  • dann kannst Du das const beliebig wegcasten und darauf schreiben

    ... und hast damit UB.

    Theoretisch, praktisch optimiert dir das jeder Compiler weg.


  • Mod

    Kennt ihr dieses Gefühl von Deja-Vu, wenn man einen Thread liest, wo sich die gleiche Diskussion noch einmal wiederholt, weil ihn irgendjemand nach einer Woche wieder nach oben gepusht hat, ohne die vorherigen Antworten zu lesen?


Anmelden zum Antworten