Frage zum speicherbedarf von Arrays



  • Hallo,

    ich habe gerade folgendes festgestellt:

    Wenn ich ein großes Array statisch anlege (damit meine ich zur Compilierzeit, zB Feld[100000]), dann wird nicht sofort der gesamte Arbeitsspeicher davon belegt. Erst wenn ich etwas in diesem Array speichere nimmt mein verfügbarer Arbeitsspeicher langsam ab. Allerdings wird auch nicht der komplette Arbeitsspeicher benötigt, wenn ich nicht an jeder Stelle des Arrays etwas abspeichere. Kann mir jemand sagen woran das liegt? schließlich ist ja in dem Array an jeder Stelle der Wert 0.00000 gespeichert. Jedenfalls wird es mir angezeigt, wenn ich ihn mir an einer Stelle printen lasse an dem ich das Array noch nicht initialisiert habe.

    Verwende ich für das gleiche Array malloc(), allokiere das Arrays also dynamisch wird sofort der gesamte Speicher belegt.

    Kann das jemand erklären? Das wäre super!



  • langi09 schrieb:

    ...dann wird nicht sofort der gesamte Arbeitsspeicher davon belegt.

    doch schon

    //wird von anfag an und idr sogar in das programm mit rein compiliert
    int array[1024];
    
    void func(){
      //wird erst bei aufruf der function erstellt
      int array[1024];
    }
    
    int main(void){
      //wird erst bei aufruf der main function erstellt
      int array[1024];
      ...
    }
    

    also wie du siehst hängt es ein bischen davon ab, ein guter compiler optimiert so viel, daß man sich manchmal fragt wo der ganze code hin ist :p

    lg lolo



  • Das liegt nicht an C sondern am virtuellen Speicher des Betriebssystems. Speicher wird erst belegt, sobald vom Programm tatsächlich darauf zugegriffen wird. malloc() ist eine Bibliotheksfunktion des Compilers, die auf den gesamten von ihr allozierten Speicher zugreift um ihn zu löschen. Deshalb ist der Speicher nach Aufruf von malloc() schon belegt.



  • Habe da auch noch eine Frage.
    Mir ist es passiert, dass wenn ich einen Array mit ca. 100'000 Membern währen der Laufzeit implementiert habe, der Fehler: " Segmentation fault (core dumped)" aufgetreten ist.
    Ist das vom Betriebsystem abhängig wie gross der Array sein kann? Der Compiler hat keine Warnung oder anderes angezeigt.
    Gruss BiJ



  • Eher von den Compilereinstellungen.
    Aber leg einfach riesige Arrays auf den heap statt auf den Stack und Du hast keine Sorgen mehr. Da schaffst Du gerne ein Gigabyte und mehr am Stück.



  • falls wirklich große Datenmengen bewältigt werden müssen, so sollte der Index in den Ram und die Nutzdaten auf die Platte statt sich auf das virtual memory management des os zu verlassen, wie es "fast jede?" Datenbank macht 😉

    lg lolo



  • noobLolo schrieb:

    falls wirklich große Datenmengen bewältigt werden müssen, so sollte der Index in den Ram und die Nutzdaten auf die Platte statt sich auf das virtual memory management des os zu verlassen, wie es "fast jede?" Datenbank macht 😉

    lg lolo

    Oder einfach jetzt schon pr0ggern, als hätte man einen 64-Bitter.



  • volkard schrieb:

    Oder einfach jetzt schon pr0ggern, als hätte man einen 64-Bitter.

    Auf denen geht der Speicher nicht aus?
    🙂



  • µngbd schrieb:

    volkard schrieb:

    Oder einfach jetzt schon pr0ggern, als hätte man einen 64-Bitter.

    Auf denen geht der Speicher nicht aus?
    🙂

    Nein, geht er nicht. Das ist ja der Trick an der Sache. Dir könnte nur der Adressraum ausgehen, tut er aber nicht. RAM ist hier nur Cache für die Platte.



  • volkard schrieb:

    Nein, geht er nicht. Das ist ja der Trick an der Sache. Dir könnte nur der Adressraum ausgehen, tut er aber nicht. RAM ist hier nur Cache für die Platte.

    Cool. Kommt auf meinen Lese-Stack.
    🙂


Anmelden zum Antworten