Arrays



  • Hallo Leute,

    ich habe heute zu meiner Überraschung gesagt bekommen, dass Arrays in C/C++ zur Compilezeit allokiert werden, was scheinbar zu folgendem Problem führt:

    Liest man Beispielsweise 3 Integer Werte a,b,c bei Programmbeginn ein und will damit ein 3-Dimensionales Array ar[a][b][c] bauen, dann ist scheinbar nicht sichergestellt, dass der Compiler genügend Speicherplatz für das Array reserviert hat, da er diesen schon zur Compilezeit festgelegt hat.

    Umgehen kann man dies scheinbar, in dem man selber per malloc/new eine eigene Array-Verwaltung schreibt was natürlich sehr lästig ist.

    Meine Frage sind nun:
    1.
    Wieviel Speicher reserviert der Compiler statisch für ein Array
    2.
    Gibt es eine elegantere Lösungen, gerade für mehrdimensionale Arrays, als eine komplette Arrayverwaltung nachzurpogrammieren?

    Gruß 🙂



  • std::vector



  • [quote="1qayWIN"]ich habe heute zu meiner Überraschung gesagt bekommen, dass Arrays in C/C++ zur Compilezeit allokiert werden.[/cpp] Jein. Der Compiler legt zur Compilezeit fest, wieviel Speicher eine Stack-Variable bekommt. Also auch Arrays, die auf dem Stack liegen. Die in C99 durchaus üblichen Arrays mit Variabler Länge gibts in C++ nicht. Bei Arrays, die zur Laufzeit (d.h. mit new[]) allokiert werden, gibts diese Beschränkung nicht.

    Liest man Beispielsweise 3 Integer Werte a,b,c bei Programmbeginn ein und will damit ein 3-Dimensionales Array ar[a][b][c] bauen, dann ist scheinbar nicht sichergestellt, dass der Compiler genügend Speicherplatz für das Array reserviert hat, da er diesen schon zur Compilezeit festgelegt hat.

    Die Aussage stimmt nicht. Der Compiler sollte das garnicht zulassen, dass ein Array mit Dimensionen definiert wird, die keine Compilezeit-Konstanten sind. Ausnahmen sind Compiler, die eine C99-Erweiterung haben, dort ist dann aber sichergestellt, dass der Compiler auch genügend Platz reserviert (wie auch immer das dann im Endeffekt läuft)

    Umgehen kann man dies scheinbar, in dem man selber per malloc/new eine eigene Array-Verwaltung schreibt was natürlich sehr lästig ist.

    Eher mit new. malloc ist in C++ nicht so gern gesehn, da es die Objekte nicht initialisiert, d.h. nur für eingebaute Datentypen sinnvoll ist und da nur einen marginalen Performance-Vorteil bringen kann.

    Wieviel Speicher reserviert der Compiler statisch für ein Array

    So viel wie die Compilezeit-Konstante, die du ihm als Größe gibst, verlangt.

    Gibt es eine elegantere Lösungen, gerade für mehrdimensionale Arrays, als eine komplette Arrayverwaltung nachzurpogrammieren?

    Ja. Bibliotheken nutzen, die das für dich bereits getan haben, z.B. die Standardbibliothek mit std::vector oder boost.MultiArray: http://www.boost.org/doc/libs/1_46_1/libs/multi_array/doc/user.html


Anmelden zum Antworten