Speicher aufgebraucht



  • useheap schrieb:

    std::vector<complex<double>> matrixa(2000);
    

    ...das war alles?
    Und später kann ich es benutzen, in dem ich einfach wie gewohnt z.B.:
    matrixa[i] = ....
    schreibe?
    Freigeben muss man da auch nichts mehr?

    That's right dude!

    Du fuegst einfach Elemente in den vector ein, indem du:

    std::vector<std::complex<double> > matrixa;
    matrixa.push_back(std::complex(4.2, 3.2));
    matrixa.push_back(std::complex(2.3, 1.1));
    

    Der vector vergroessert sich automatisch, wenn er merkt, dass er kein Platz hat und gibt den Speicher automatisch wieder frei.

    Wenn du aber von vornherein weisst, dass der vector mind./max. 2000 Objekte enthalten wird, kannst du den Speicher reservieren: (Performanzvorteil)

    std::vector<std::complex<double> > matrixa(2000);
    // oder
    matrixa.reserve(2000);
    

    Du sagst danke, ich sag bitte!



  • vector,...easy! schrieb:

    Wenn du aber von vornherein weisst, dass der vector mind./max. 2000 Objekte enthalten wird, kannst du den Speicher reservieren: (Performanzvorteil)

    std::vector<std::complex<double> > matrixa(2000);
    // oder
    matrixa.reserve(2000);
    

    Das ist nicht das Gleiche.
    Speicher wird in beiden Fällen angefordert (capacity()==2000), im ersten Beispiel wird jedoch die Größe des Vectors ebenfalls auf 2000 gesetzt, daher wäre matrixa.resize(2000); äquivalent.



  • Sorry, irgendwie check ichs nicht ganz:

    [...]
    using namespace std;
    [...]
    //complex<double> fit1[2001];   hatte ich vorher...
    std::vector<complex<double>> fit1(2001);
    

    Fehlermeldungen:
    'vector': Ist kein Element von 'std'
    'vector': nichtdeklarierter Bezeichner
    'std::complex<double>': Ungültige Verwendung dieses Typs als Ausdruck
    "fit1": Bezeichner wurde nicht gefunden.
    und später, wo ich fit1 benutze:
    'fit1': nichtdeklarierter Bezeichner

    Bei zweidimensionalen arrays...
    std::vector<complex<double>> bsp(100)(100);
    ???



  • Gib das using namespace weg.



  • probier mal #include <vector>


  • Mod

    Hast du #include<vector> vergessen?

    Bei zweidimensionalen Strukturen nimmst du einen vector mit einem vector drin oder besser mit einem std::array. Die Initialisierung läuft dann auch ein bisschen anders, guck dir mal die Konstruktoren des vectors an, was so alles möglich ist.



  • Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?



  • 314159265358979 schrieb:

    Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?

    Verwirr den Neuling nicht mit deiner unnötigen Frage.
    Erstell einen neuen Thread.



  • Geht ja auch so:

    std::unique_ptr<std::array<foo, 256>> my_static_vector(new std::array<foo, 256>());
    

  • Mod

    314159265358979 schrieb:

    Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?

    Zu welchem Zweck? Welchen Vorteil sollte das bieten gegenüber einem stdd::array, das auf dem free store angelegt wird?



  • Bei std::array ist die Größe eine Compilezeit-Konstante.



  • Danke euch allen, ja, das hab ich natürlich verpennt zu includen.
    Ich nehme an, am besten schreib ich sämtliche arrays nach dem Schema um, sodass ich keine weiteren Speicherprobleme bekomme..!?
    Zu dem zweidimensionalen komme ich erst später, aber ich denke das könnte ich dann vollends alleine hinkriegen.
    Danke nochmals


  • Mod

    useheap schrieb:

    Danke euch allen, ja, das hab ich natürlich verpennt zu includen.
    Ich nehme an, am besten schreib ich sämtliche arrays nach dem Schema um, sodass ich keine weiteren Speicherprobleme bekomme..!?
    Zu dem zweidimensionalen komme ich erst später, aber ich denke das könnte ich dann vollends alleine hinkriegen.
    Danke nochmals

    Der typische Stolperstein bei vector in vector, den vermutlich jeder macht, ist zu vergessen, dass man den inneren vectoren erst einmal Elemente zuweisen muss, bevor diese Elemente benutzen kann. Klingt zwar ganz einleuchtend, aber irgendwie kommt die Frage hier dauernd.



  • 314159265358979 schrieb:

    Bei std::array ist die Größe eine Compilezeit-Konstante.

    Stimmt, hab das grad durcheinandergeworfen.



  • 314159265358979 schrieb:

    Warum gibts eigentlich noch keinen std::vector mit fixer Größe (aber dennoch Heap-Allokation)?

    Ein vector hat genau dann eine fixe Größe, wenn du sie nicht veränderst.



  • Und du hast nicht verstanden was ich überhaupt will. Danke trotzdem für den sinnlosen Beitrag.


  • Mod

    Es ist aber relativ einfach, eine Vectorgröße als Compilezeitkonstante zu haben:

    const size_t bar_size = 5;
    vector<foo> bar(bar_size);
    

    Dafür eine eigene Klasse in die Standardbibliothek aufnehmen ist doch echt nur Bloat.



  • Und dafür habe ich den Overhead eines size_type im Vector zum speichern der Kapazität (oder eben einen Zeiger, je nach Implementierung), außerdem auf Vorrat zusätzlich angelegte Elemente.



  • 314159265358979 schrieb:

    Und dafür habe ich den Overhead eines size_type im Vector zum speichern der Kapazität (oder eben einen Zeiger, je nach Implementierung)

    Ist das dein Ernst? Nenne mir ein praxisrelevantes Beispiel, wo du derart viele kleine Vektoren mit fixer Größe hast, dass dies eine Rolle spielen würde.

    314159265358979 schrieb:

    außerdem auf Vorrat zusätzlich angelegte Elemente.

    Nein. Keine mir bekannte Implementation der Standardbibliothek reserviert mehr als die angegebene Anzahl bei Verwendung dieses Konstruktors.


  • Mod

    Athar schrieb:

    314159265358979 schrieb:

    Und dafür habe ich den Overhead eines size_type im Vector zum speichern der Kapazität (oder eben einen Zeiger, je nach Implementierung)

    Ist das dein Ernst? Nenne mir ein praxisrelevantes Beispiel, wo du derart viele kleine Vektoren mit fixer Größe hast, dass dies eine Rolle spielen würde.

    Sie sind ja nicht einmal klein, sonst würde er ja ein fixes Array(-klasse) nehmen.

    Also, Pi, wenn du wirklich mal einen Fall haben solltest, wo das relevant ist, dann ist das eine Sache von einer Stunde das sauber hin zuschreiben, aber extra eine weitere Klasse in den Standard, das ist einfach zu unnötig.


Anmelden zum Antworten