Grundlegende Frage zu CArray



  • In meinem Programm werden Messdaten (float-Werte) erfasst. Dabei wird mit einem Sensor ein zylindrisches Target abgetastet, auf dem etwas aufgewickelt wird. Auf dem Umfang sind 200 Messpunkte verteilt. Diese Messung umfasst ca. 20-30 Lagen. Dies bedeutet im ungünstigsten Fall 6000 Messwerte. Später müssen noch Dicken errechnet werden (Messwert[199+i]-Messwert[i]). Die Gesamtanzahl der Messpunkte ist unbekannt, da erst bei Erreichen eines Schwellwertes dieser Vorgang abgebrochen werden soll.
    Jetzt hab ich mir überlegt, die Daten in ein CArray <flaot,float> zu schreiben, da dies dynamsisch erweiterbar ist. Ist diese Datenstruktur zu empfehlen? Weiterhin könnte bei der Größe das hier auch zum Problem werden:

    MSDN schrieb:

    Before using an array, use SetSize to establish its size and allocate memory for it. If you do not use SetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.

    Was sagt ihr dazu? Kann man das so machen? in einem anderen Thread hab ich gelesen, dass man große Arrays dynamisch auf dem Heap erzeugen soll. Hat man aber da nicht das gleiche Problem?
    Bin momentan etwas ratlos... 😕



  • Benutz doch einen dynamischen Container, wie z. B. "vector"..
    Da brauchst du keinen Speicherplatz reservieren, etc.



  • CArray ist im Prinzip das gleiche wie std::vector.

    Wenn man nicht weiß, was man nehmen soll, ist man immer mit einem vector bzw. CArray am besten beraten. Wenn es massive Laufzeitprobleme gibt, kann man immer noch auf einen anderen Container-Typ umsteigen.

    Letztendlich hat JEDER Container-Typ seine Vor- und Nachteile. Du wirst IMMER einen warnenden Hinweis finden, wie du ihn zitiert hast. Warum? Wenn ein Container-Typ keinen Nachteil hätte, wäre er perfekt und dann würde es auch nur noch diesen einen Container-Typ geben. Dem ist aber nicht so. Also, nimm erstmal CArray! Selber ein Array per new würde ich NICHT anlegen. Man hat dadurch keinen Vorteil ggü. CArray oder std::vector.

    Hier noch eine interessante Hilfe:
    http://msdn2.microsoft.com/de-de/library/y1z022s1(VS.80).aspx



  • Hallo Artchi,

    so sehe ich das jetzt auch nachdem ich nochmal recherchiert habe. Allerdings stellt sich mir trotzdem eine Frage, eventuell hab ich ja da auch was falsch verstanden.
    Wenn ich das richtig sehe, dann wird dem Array (oder auch einem Vektor) ein gewisser Speicherbereich zugewiesen, der bei kleinen Indexzahlen auch unproblematisch ist. Wächst der Index, so muss weiterer Speicher zur verfügung gestellt werden, der ggf. ja nicht an den vorherigen anknüpft, da ja noch weitere Instanzen Speicher belegen. Also kommt es zur Fragmentierung. Die kann ggf. durch Umordnen wieder aufgehoben werden, was aber zu Lasten der Performance geht.
    Sehe ich das so richtig? Wenn man jetzt mit SetSize den Speicher allociert, dann dürfte dieser doch in einem zusammenhängenden Block liegen. Kann man dann trotzdem über diese Grenze hinaus das Array erweitern (dann wieder zu Lasten der Performance) oder ist da definitiv Schluss?



  • Also beim vector<> (dort kannst du über reserve() angeben, wieviele Daten du erwartest) wird der entsprechende Speicherbereich angefordert - wenn du doch über deine Schätzung hinausgehst, wird der Block vergrößert.

    (und das "Problem" ist hauptsächlich, daß der verwaltete Speicher zusammenhängend sein muß - wenn der Container an seine Kapazität kommt, muß er einen entsprechend größeren Block anfordern und alle Elemente dorthin kopieren)



  • Wenn man jetzt mit SetSize den Speicher allociert, dann dürfte dieser doch in einem zusammenhängenden Block liegen. Kann man dann trotzdem über diese Grenze hinaus das Array erweitern (dann wieder zu Lasten der Performance) oder ist da definitiv Schluss?

    Nö, da ist nicht Schluss. Warum auch? Nur weil ich new float[100] mache, verbietet mir doch der PC nicht, danach new float[200] zu machen. Nichts anderes passiert, wenn Du SetSize(100) machst. Wenn die 100 nicht ausreichen, macht der CArray/vector einfach danach ein neues new und kopiert den alten Kram in das neu angelegte float[200] um und das alte zerstört er mit delete. Ist ja kein Hockuspockus. 😉 Die Container bedienen sich C++-Sprachmitteln. Der Vorteil ist nur, das man den ganzen Kram nicht selber implementieren muß und alles schon getestet und millionenfach von anderen Programmierern benutzt wurde. Und sich das ganze einfacher warten lässt, weil die Container jeder kennt und dokumentiert sind.


Anmelden zum Antworten