Anfängerfrage zu Speicher allokieren



  • Hallo ihr Lieben des großen "C"
    ich habe da verschiedene Funktionen die ähnlich sind wie diese,
    weil für MCU Speicher immer noch knapp ist wollte ich von euch C Spezis
    mal hören was sinnvoller ist

    void OnSetCPU(void)
    {
    	char S[20];
    	  strcpy(S, cmdMessenger.readStringArg());
    	  SetText(Text_X1, Text_Y_S + Text_Y *2, S, clLGTGRAY);
    }
    

    soll ich char S[20]; in jede Funktion Packen weil der Compiler den Speicher nur beim Aufruf generiert oder soll ich das besser global machen, weil das wir der Speicher nur einmal allokiert



  • 1. Es kommt darauf an wie genau dein programm arbeitet - keine allgemine aussage moeglich
    2. "Nur beim Aufruf generiert" oder nur einmal "nur einmal allokiert" klingt nicht so als wuerdest du genau wissen was der unterschied zwischen stack und heap ist

    Erleuchte uns



  • Globale Variablen sind bei Großrechnern eine Sünde. Aber bei MCUs bieten sie Vorteile. Lokale Variablen belasten den Stack (meistens), sind aber sonst eher unkritisch. Manchmal ist auch ein Heap sinnvoll, aber nur auf den ganz dicken Controllern. Bei den kleinen, mit wenigen KBytes RAM, wählt man besser eine statische Speicheraufteilung. 🙂


  • Mod

    Mach Variablen so lokal wie möglich. Es gibt auch sehr, sehr gute Gründe dafür, aber bei all der Missinformation in diesem Thread würde ich ein kleines Buch schreiben müssen, um genau zu erklären, warum. Die Kurzfassung ist, dass die globale Variante keinerlei Vorteile hat, die lokale Variante hat hingegen sowohl technische Vorteile als auch ist es schlicht einfacher für den Programmierer.



  • Lötkolbengott recht hast Du
    Ich habe eine globale Variable genommen und spare ein paar Bytes.
    Ja bei MCU Arduinos ist es was anderes da hast Du nur 32 kb ROM in einem
    Atmel 328p.

    Danke für eure Antworten.



  • Ich habe eine globale Variable genommen
    und spare ein paar Bytes.

    wenn es dann aber immer mehr globale Variablen werden hast du die immer als default Verbrauch

    wenn du von ein paar Bytes gespart sprichst meinst du
    die Codemenge bei "Direkter zugriff auf gloable" oder "reservieren des Speichers auf dem Stack" oder?

    hab mal einen Vergleich gemacht und du scheinst recht zu haben - die globale
    führt zu viel weniger Code - vielleicht mache ich aber auch etwas falsch

    zum Spielen:
    https://godbolt.org/g/HNfCJL


  • Mod

    Gast3 schrieb:

    Ich habe eine globale Variable genommen
    und spare ein paar Bytes.

    wenn es dann aber immer mehr globale Variablen werden hast du die immer als default Verbrauch

    wenn du von ein paar Bytes gespart sprichst meinst du
    die Codemenge bei "Direkter zugriff auf gloable" oder "reservieren des Speichers auf dem Stack" oder?

    hab mal einen Vergleich gemacht und du scheinst recht zu haben - die globale
    führt zu viel weniger Code - vielleicht mache ich aber auch etwas falsch

    zum Spielen:
    https://godbolt.org/g/HNfCJL

    Der wesentliche Unterschied ist nicht global vs. lokal (was sich auf die Sichtbarkeit des Variablennamens bezieht), sondern statische vs. automatische Speicherdauer: https://godbolt.org/g/RFdXgj

    Es gibt schlicht keinen guten Grund, Variablen, die logisch nur zu einer Funktionen gehören, im globalen Namensraum zu definieren. Das führt nur zu Spaghettiprogrammen.



  • @camper
    Das ist die beste Lösung, habe an Fall gedacht er koennte die variablen noch anderweitig einsetzen, aber globale bleiben eben hoechst schmutzig - und meist unnötig



  • ats3788 schrieb:

    Lötkolbengott recht hast Du

    Das kannst du überhaupt nicht beurteilen.
    Globale Variablen sind Schrott, für Anfänger immer, für Profis (also Leute, die seit >20 Jahren mit C umgehen und wissen was sie tun) nur sehr selten eine Lösungsvariante.

    void OnSetCPU(void)
    

    Vollkommen sinnfreier Anfängerdesignschrott weil er zwingend globale Variablen bedingt.

    strcpy(S, cmdMessenger.readStringArg());
    

    Sieht schon sehr nach C++ aus, d.h. also, du weißt selbst nicht, was du tust.

    {
        char S[20];
          strcpy(S, cmdMessenger.readStringArg());
          SetText(Text_X1, Text_Y_S + Text_Y *2, S, clLGTGRAY);
    }
    

    Warum sinnfreie zusätzliche Abhängigkeiten schaffen (hier Begrenzung auf 19-Zeichen String?) statt

    SetText(Text_X1, Text_Y_S + Text_Y *2, cmdMessenger.readStringArg(), clLGTGRAY);
    

    unterschied zwischen stack und heap ist

    Stack und Heap sind keine Standardvokabeln.



  • ats3788 schrieb:

    Ich habe eine globale Variable genommen und spare ein paar Bytes.

    Nebenbei hilfst du damit auch dem Compiler, kompakteren und schnelleren Code zu erzeugen.

    Aber wie schon gesagt wurde, sollte man globale Variablen möglichst meiden, wenn man für dicke PCs programmiert. Man sollte sich sowas nicht angewöhnen, Obwohl sogar Windows im Kernel globale Variabel einsetzt. Naja, bei MS ist vieles mit der heißen Nadel gestrickt. 🙂



  • Warum muss der Text überhaupt irgendwo zwischengespeichert werden? Geht es nicht auch so?

    void OnSetCPU(void)
    {
      char S[20];
      SetText(Text_X1, Text_Y_S + Text_Y *2, cmdMessenger.readStringArg(), clLGTGRAY);
    }
    


  • Printe schrieb:

    Warum muss der Text überhaupt irgendwo zwischengespeichert werden? Geht es nicht auch so?

    void OnSetCPU(void)
    {
      char S[20];
      SetText(Text_X1, Text_Y_S + Text_Y *2, cmdMessenger.readStringArg(), clLGTGRAY);
    }
    

    Du hast du immer noch das Array definiert (wird der Compiler raus optimieren)
    ^(Der Vorachlag kam schon gestern um 20:43:33)^


Log in to reply