Klassenvektor in main() ausgeben



  • @theAnfänger77 sagte in Klassenvektor in main() ausgeben:

    Beim std::vector handelt es sich um eine Einfach verkettete Liste.

    Das ist falsch. Es handelt sich um ein dynamisch wachsendes Array. Eine einfach verkettete Liste findet sich unter std::forward_list.



  • @theAnfänger77 sagte in Klassenvektor in main() ausgeben:

    Beim std::vector handelt es sich um eine Einfach verkettete Liste.
    Dazu gibt es z.B. bei YouTube sehr viele gute Tutorials.

    Das Merkmal einer Liste ist, dass einem Element mindestens ein benachbartes Element bekannt ist. Das ist beim Vector nicht der Fall.
    Ein vector<T> ist intern einfach nur ein Array von T-Objekten, also vom Typ T*.
    D.h. alle Objekte liegen nebeneinander im Speicher, sind aber nicht miteinander verknüpft. Sie sind einfach nur "da". 😃

    Durch die Konstruktion des Vector muss ein großer Speicherklotz am Stück verfügbar sein. D.h. wenn du 1 Mio Objekte der Größe 1Kb im Vector lagern willst, muss im Arbeitsspeicher 1GB am Stück verfügbar sein. Bei stark fragmentiertem Speicher kann man da durchaus auf Probleme stoßen.

    Die Liste hingegen hat im Gegensatz zum Vector Overhead bei jedem einzelnen Knoten, verbraucht also mehr Speicher.



  • @It0101 sagte in Klassenvektor in main() ausgeben:

    Durch die Konstruktion des Vector muss ein großer Speicherklotz am Stück verfügbar sein. D.h. wenn du 1 Mio Objekte der Größe 1Kb im Vector lagern willst, muss im Arbeitsspeicher 1GB am Stück verfügbar sein. Bei stark fragmentiertem Speicher kann man da durchaus auf Probleme stoßen.

    Das hängt davon ab, auf was das C++ läuft. Auf einem modernen OS wie IX oder die Win NT Varianten, ist das kein Thema mehr, weil das OS den Speicher in virtuellen Adressräumen der Applikation zur Verfügung steht, und das OS interne Listen mit physikalischen Speicherseiten führt, die können in der Realität wild fragmentiert sein. Einige OS haben auch RAM Defragmentierer, die Speicherseiten physikalisch verlagern, damit die mehrere physikalische Seiten hintereinander abfolgen. D.h. solange man die interne Verwaltung der Speicherseiten des OS nicht überfordert, passiert da nichts Dramatisches mehr.

    Anders sieht das auf einem embedded System aus, da hat man nur einen hosted Compiler und der bekommt dann schnell mal Probleme.



  • @john-0
    Danke fürs Update 🙂


  • Mod

    @It0101 sagte in Klassenvektor in main() ausgeben:

    @john-0
    Danke fürs Update 🙂

    Naja, das ist seit ca. 40 Jahren so…
    Relevant kann aber die programminterne Fragmentierung des virtuellen Adressraums sein, aber das ist heute auch noch genauso wie vor 40 Jahren, außer dass der Adressraum seither größer geworden ist.



  • @SeppJ sagte in Klassenvektor in main() ausgeben:

    Naja, das ist seit ca. 40 Jahren so…

    Für die große Masse der Nutzer aber nicht. Windows 1.0, 2.0, 3.0, 3.1, WfW 3.11, 95, 98, 98SE, Me haben das nicht gehabt. Erst mit XP (Oktober 2001) kam Win NT zu den normalen Nutzern. Bei MacOS kam der Wechsel von MacOS 9 zu MacOS X ungefähr zum selben Zeitpunkt. Also seit ca. 20 Jahren gibt es das für Normalos.


Anmelden zum Antworten