Ist der Artikel GenericProgramming Typed Buffers mit C ++ 11 komplett veraltet?

8

Ich lese Generic & lt; Programmierung & gt; Typed Buffers , ein ziemlich alter Artikel von Andrei Alexandrescu.

Ich frage mich, ob es immer noch Sinn macht. In seinem Artikel weist Alexandrescu auf einige Probleme mit std::vector hin, wenn die Leistung kritisch ist:

  • Unnötige Dateninitialisierung beim Zuordnen eines Vektors, der mit std::vector::reserve gelöst werden kann
  • teure Move-Operation, die mit C ++ 11 und move semantics
  • gelöst wird
  • Die meisten Compiler optimieren nicht std::vector für den Typ wie char , indem Sie std::memcpy und std::memmove verwenden. Das ist jetzt für Mainstream-Compiler (von dem, was ich gesehen habe) nicht wahr.
  • Exponentielles Wachstum. Sie können die Kapazität von std::vector nicht verkleinern, um sie mit einem einfachen Methodenaufruf an die Größe anzupassen. Was seit C ++ 11 mit std::vector::shrink_to_fit() auch nicht stimmt

Meine Frage ist, ist dieser Artikel völlig veraltet, kann ich jetzt auf Vektor (einschließlich benutzerdefinierter Zuordnung, wenn nötig) verlassen, um einen schnellen zusammenhängenden Puffer zu haben?

    
vac 21.07.2014, 14:53
quelle

1 Antwort

3

C ++ 11 schließt die Lücke zwischen std::vector und rohen Arrays weitgehend (Bewegungssemantik und shrink_to_fit lösen einige von Alexandrescus Punkten), aber die Nische existiert immer noch in gewissem Maße; std::vector setzt die Initialisierung der Elemente fort. reserve hilft nicht, weil Sie nicht auf den reservierten Speicher zugreifen können. Sie können dies mit einem benutzerdefinierten Zuordner hacken, aber es ist bei weitem nicht zufriedenstellend.

Am anderen Ende macht unique_ptr<T[]> das Halten eines Puffers in Ihrer Containerklasse viel einfacher, da es die Ausnahmesicherheitsprobleme weitgehend löst. Der TS dynarray , der bei der Konstruktion eine Fixed-Size-Zuweisung mit Standard-Initialisierung bietet, sieht wahrscheinlich so aus Schließen Sie einen Großteil des Rests der Lücke.

Die verbleibende Nische, die Alexandrescus generische Puffer belegen, besteht darin, default-initialisierte Elemente mit O (n) Shrink- und Grow-Operationen anzubieten; Diese sind im Allgemeinen nicht als Komponente von Container-Klassen nützlich und können bei Bedarf als Nicht-Member-Funktionen geschrieben werden.

    
ecatmur 21.07.2014, 15:46
quelle

Tags und Links