vector+Speichermanagment



  • Halli Hallo!

    Und wieder mal ne Frage zur STL:

    Ich hab gelesen, dass der Speicheraufwand eines Vectors der STL dem eines normalen Arrays entsprechen soll. Welcher Speicher wird denn nun aber durch 'std::vector' beansprucht?

    Ein dynamisches Array der Form
    char *array=new char[100]
    beansprucht ja den Heap, der ja leider auch nur über begrenzte Ressourcen verfügt!

    Weiss einer von euch, wie bei einem Vector vorgegangen wird?
    Sollte man bei grösseren Datenmengen, die dynamisch zu verwalten sind, einen Vector einem dynamischen Array vorziehen?
    Denn die LinkedList scheidet ja bei größeren Datenmengen schon im Voraus aus.(gehört ja zu den speicherintensivsten Datenstrukturen)

    Danke!

    Grüße,
    TS++



  • Was gibt es denn besseres als den Heap? Der Stack ist normalerweise nur 1MB groß. Und da es bei Windows ja virtuellen Arbeitsspeicher gibt, ist der Heap quasi fast so groß wie deine Festplatte. *g*



  • OK, Danke!

    Weiss vielleicht noch jemand, wie bei einem 'std::vector' die Speicherverwaltung betrieben wird?

    Grüße,
    TS++



  • eine liste scheidet nicht aus.

    sie hat halt pro element einen overhead von 1 oder 2 zeigern - das macht aber nicht viel wenn die objekte ansich riesig sind.

    ein vector braucht nur 1 zeiger + 2 ints fuer alle objekte zusammen.

    ein vector ist einfach nur die kapselung eines dynamischen arrays

    dass dir der speicher ausgeht musst du nicht befuerchten, schliesslich gibt es wie mein vorredner schon gesagt hat, auf modernen Betriebssystemen ja nahezu unbegrenzt speicher am heap.

    also sag uns mal was du machen willst und wir sagen dir welchen container dafuer am geeignetesten waere...



  • Ok, es geht um folgende Aufgabe:

    Ich möchte im Rahmen einer 3DSimulation eine recht aufwendig zu berechnende Animation vor dem eigentlichen Rendern berechnen. D.h.: die Animation besteht aus einzelnen Animationsschritten. Jeder Animationsschritt wiederum besteht aus einem Index auf einen Positionsvektor und aus drei Indizes auf drei Vektoren, die die drei Achse des lokalen Koordinatensystems darstellen.

    Annahme:
    - Animationsdauer: 120 sec.
    - fps: 30 Bilder
      ==> 120*30 = 3600 Animationsschritte
    
    - jeder Schritt enthält 4 Indizes (4*int)
      ==> 3600 * 4 = 14400 Indizes insgesamt
          ==> 14400 * 2Byte = 28800 Byte
                              -----
    
    soviel zu den Animationsschritten.
    Doch nun zu den durch Indizes referenzierten Vektoren:
    - 1 Vektor besteht aus 3 Koordinaten (3*float)
    - Es ist damit zu rechnen, dass 40% aller Vektoren mehrmals benötigt werden
      ==> 0.6 * 14400 = 8640 Vektoren
          ==> 8640 * 3float = 8640 * 3 * 4Byte = 103680 Byte
                                                 ------
    
    gesamt:
    -------
                28800 Byte
             + 103680 Byte
             -------------
               132480 Byte (130 KB)
               ......
    
    Und der ganze Aufwand nur für eine Animation, die nach Möglichkeit in Echtzeit ablaufen soll. Da erschrickt man zuerst schon!
    

    Grüße,
    TS++

    [ Dieser Beitrag wurde am 15.06.2003 um 18:30 Uhr von TS++ editiert. ]



  • du erschrickst bei 130kb? hast du einen 286er?



  • Eigentlich kann man sich folgende Regel merken: Nutze so oft die STL wie nur möglich! So schlägt man eigentlich immer den sichersten Weg ein.



  • Morgen!

    OK, ich geb zu dass ich mit der Aussage
    'Da erschrickt man zuerst schon'
    etwas übertrieben habe.
    Vielleicht war der Frust dafür verantwortlich, dass ich die Animationen nicht während des eigentlichen Rendervorgangs berechnen kann, sondern in eigenen Datenstrukturen archivieren muss.
    Ich rechne mit mindestens 25 Animationen -> 3250 KB (3.16 MB)
    Der Endanwender kann dann noch eigene Animationen mit einsetzen. So eine Animation wird im Schnitt 1.5 KB gross sein. Nun, wieviele Animationen wird dann so ein Anwender im Schnitt erzeugen? Vielleicht so 100 Stück. 100*1.5KB = 150 KB ==> fällt also kaum ins Gewicht.
    Wenn ichs genau überlege, ist dann die Wahrscheinlichkeit, dass die Animationen die 4MB überschreiten eigentlich recht gering( also Kommando zurück )

    Kurz und gut: Ich bin vielleicht etwas überkritisch, wenn es um Speicherverbrauch geht! Ich werd auf jeden Fall die TemplateKlassen vom STLPort mit eigenen Schnittstellen nutzen( die vorhandenen Methoden und Operatoren gefallen mir nicht so ganz ). Falls ich nicht unbedingt ContainerKlassen benötige, werde ich auch weiterhin alle dynamischen Objekte auf den Heap packen.

    Danke für eure Anmerkungen!
    Ich muss zugeben, dass ich zwar wusste das Stack, Heap und Programm als eigene Segmente im Arbeitsspeicher angesetzt werden und das ein seitenweises Ein- und Auslagern auf die Platte durchgeführt wird. Skeptisch war ich nur, da ich im Zusammenhang mit dynamischer Speicherverwaltung in bisher allen Lektüren immer eindringlichst davor gewart wurde, dass relativ schnell kein Speicher mehr zur Verfügung stehen könnte. Jetzt ist mir endlich klar, dass das Paging auch den kompletten Heap betrifft.

    Grüße,
    TS++

    [ Dieser Beitrag wurde am 16.06.2003 um 08:38 Uhr von TS++ editiert. ]

    [ Dieser Beitrag wurde am 16.06.2003 um 08:40 Uhr von TS++ editiert. ]



  • - neu gepostet!

    [ Dieser Beitrag wurde am 16.06.2003 um 09:46 Uhr von TS++ editiert. ]


Anmelden zum Antworten