[gelöst] Heap verliert scheinbar grundlos seinen Inhalt



  • Ethon schrieb:

    Wieso wird hier über die Performance von std::vector schlecht geredet? Soetwas besitzt ein new[] Array gar nicht.

    Doch. Ein new int[1000] ist schneller als ein vector<int>(1000), eben weil ein int ein POD ist und PODs durch new nicht mit 0 initialisiert werden.

    Ethon schrieb:

    Der einzige Unterschied ist ein zusätzlicher Pointer auf Seiten des Vektors

    Zwei zusätzliche Pointer, weil du die Grösse meist noch woanders gespeichert hast.


  • Mod

    keksfresser schrieb:

    Ethon schrieb:

    Der einzige Unterschied ist ein zusätzlicher Pointer auf Seiten des Vektors

    Zwei zusätzliche Pointer, weil du die Grösse meist noch woanders gespeichert hast.

    Ein zusätzlicher Pointer, weil du bei vector die Größe nicht speichern musst. Dafür aber echter und deutlicher Performanceverlust, falls du nach und nach Elemente zu deinem new-Array hinzufügen musst. Also im wohl allerhäufigsten Anwendungsszenario, denn selten weiß man im Voraus, wieviel kommen wird.



  • keksfresser schrieb:

    Ethon schrieb:

    Wieso wird hier über die Performance von std::vector schlecht geredet? Soetwas besitzt ein new[] Array gar nicht.

    Doch. Ein new int[1000] ist schneller als ein vector<int>(1000), eben weil ein int ein POD ist und PODs durch new nicht mit 0 initialisiert werden.

    Upps, erstens seh ich dass ich da etwas übersehen habe, ich hab mich bei der Aussage auf push_back bezogen. Soetwas hat ein new[] array nicht.

    Stimmt. Das sind aber auch nur einmalige Kosten.

    keksfresser schrieb:

    Ethon schrieb:

    Der einzige Unterschied ist ein zusätzlicher Pointer auf Seiten des Vektors

    Zwei zusätzliche Pointer, weil du die Grösse meist noch woanders gespeichert hast.

    Bei new[] müsste ich mir die Größe auch irgendwo merken. Oder wenn sie sowieso bekannt ist: std::array.



  • SeppJ schrieb:

    keksfresser schrieb:

    Ethon schrieb:

    Der einzige Unterschied ist ein zusätzlicher Pointer auf Seiten des Vektors

    Zwei zusätzliche Pointer, weil du die Grösse meist noch woanders gespeichert hast.

    Ein zusätzlicher Pointer, weil du bei vector die Größe nicht speichern musst. Dafür aber echter und deutlicher Performanceverlust, falls du nach und nach Elemente zu deinem new-Array hinzufügen musst. Also im wohl allerhäufigsten Anwendungsszenario, denn selten weiß man im Voraus, wieviel kommen wird.

    ... was sich, nebenbei bemerkt, auch hervorragend mit einer Liste lösen lässt. Nur der Zugriff auf diese Elemente gestaltet sich dann - das gebe ich zu - ohne weiteren Buffer wieder recht langsam.



  • SeppJ schrieb:

    Meistens will man auch dynamische Arrays. Aber wenn man sie nicht braucht, dann nimmt man weder vector noch new.

    Es geht hier nur um Sequenzen von Elementen, deren Anzahl erst zur Laufzeit feststeht.

    Der aus dem Westen .. schrieb:

    std::vector erzeugt einen Overhead, welcher bei einigen Anwendungsgebieten vermeidbar ist, wenn man stattdessen Arrays benutzt.

    Was für Arrays? Statische -> siehe oben

    keksfresser schrieb:

    Ethon schrieb:

    Wieso wird hier über die Performance von std::vector schlecht geredet? Soetwas besitzt ein new[] Array gar nicht.

    Doch. Ein new int[1000] ist schneller als ein vector<int>(1000), eben weil ein int ein POD ist und PODs durch new nicht mit 0 initialisiert werden.

    Davon war vorher nie die Rede. Ein Punkt für das new[] ohne Standardinitialisierung, wenn man dieses Verhalten denn wirklich braucht.



  • SeppJ schrieb:

    Ein zusätzlicher Pointer, weil du bei vector die Größe nicht speichern musst.

    Ihr versteht nicht.
    Man will ein Array mit Grösse n, wobei n erst zur Laufzeit bekannt ist.
    n ist eine Variable vom Typ size_t.

    size_t n; std::cin >> n; // n ist erst zur Laufzeit bekannt.
    std::unique_ptr<char[]>(new char[n]); // wunderbar
    std::vector<char>(n); // schlecht. Overhead 2 Pointer + memset auf n bytes
                          // Merke: ich habe n und kann es nicht /nicht/ speichern.
    

    SeppJ schrieb:

    Dafür aber echter und deutlicher Performanceverlust, falls du nach und nach Elemente zu deinem new-Array hinzufügen musst. Also im wohl allerhäufigsten Anwendungsszenario, denn selten weiß man im Voraus, wieviel kommen wird.

    lol, optimierst du schon bevor du weisst, wieviel kommen wird?



  • Der aus dem Westen .. schrieb:

    SeppJ schrieb:

    keksfresser schrieb:

    Ethon schrieb:

    Der einzige Unterschied ist ein zusätzlicher Pointer auf Seiten des Vektors

    Zwei zusätzliche Pointer, weil du die Grösse meist noch woanders gespeichert hast.

    Ein zusätzlicher Pointer, weil du bei vector die Größe nicht speichern musst. Dafür aber echter und deutlicher Performanceverlust, falls du nach und nach Elemente zu deinem new-Array hinzufügen musst. Also im wohl allerhäufigsten Anwendungsszenario, denn selten weiß man im Voraus, wieviel kommen wird.

    ... was sich, nebenbei bemerkt, auch hervorragend mit einer Liste lösen lässt. Nur der Zugriff auf diese Elemente gestaltet sich dann - das gebe ich zu - ohne weiteren Buffer wieder recht langsam.

    list ist beim Anfügen und beim Iterieren langsamer als vector .
    Hinzufügen ans Ende können beide in konstanter Zeit, vector ist da aber schneller, weil im Mittel kein Speicher angefordert wird.
    Iteration bei list = Herumspringen im Speicher = schlecht für den Cache.



  • TyRoXx schrieb:

    Der aus dem Westen .. schrieb:

    SeppJ schrieb:

    keksfresser schrieb:

    Ethon schrieb:

    Der einzige Unterschied ist ein zusätzlicher Pointer auf Seiten des Vektors

    Zwei zusätzliche Pointer, weil du die Grösse meist noch woanders gespeichert hast.

    Ein zusätzlicher Pointer, weil du bei vector die Größe nicht speichern musst. Dafür aber echter und deutlicher Performanceverlust, falls du nach und nach Elemente zu deinem new-Array hinzufügen musst. Also im wohl allerhäufigsten Anwendungsszenario, denn selten weiß man im Voraus, wieviel kommen wird.

    ... was sich, nebenbei bemerkt, auch hervorragend mit einer Liste lösen lässt. Nur der Zugriff auf diese Elemente gestaltet sich dann - das gebe ich zu - ohne weiteren Buffer wieder recht langsam.

    list ist beim Einfügen und beim Iterieren langsamer als vector .

    std::list kann ich nicht beurteilen, damit habe ich bisher kaum gearbeitet. Was ich allerdings festgestellt habe, ist dass wenn ich meine Liste from the scratch implementiere, diese schneller als der Vektor ist.



  • Also eine nicht- std -Liste verglichen mit std:vector . Vor allem in C kann man hier recht schöne, typenunabhängige Konstrukte bauen, durch die blickt dann aber kein Schwein mehr durch.



  • Der aus dem Westen .. schrieb:

    Was ich allerdings festgestellt habe, ist dass wenn ich meine Liste from the scratch implementiere, diese schneller als der Vektor ist.

    Was genau verstehst du denn unter "schneller"?


  • Mod

    Da der Thread zu DadWs Märchenstunde verkommen ist (C typunabhängig gegenüber C++, eigene Liste schneller als vector), können wir uns den Rest auch sparen. Und @DadW: Lern C++, wenn du hier mitreden möchtest, ansonsten such dir wieder sdf zum diskutieren.


Anmelden zum Antworten