Vektorverhalten in C 11 und Boost.Container: Umgang mit nicht initialisierten Elementen
In C-Anwendungen werden Vektoren häufig als temporäre Puffer verwendet. Um eine ausreichende Kapazität sicherzustellen, werden diese Vektoren häufig Größenänderungsvorgängen unterzogen. In C 03 erweitert die Funktion std::vector::resize() den Vektor durch Anhängen von Kopien eines angegebenen Werts. Während dieser Ansatz ungenutzte Elemente initialisiert, kann er ineffizient sein, wenn nur die Vektorgröße zählt.
C 11 hat zwei Überladungen von resize() eingeführt:
- resize(size_type n): Führt einen Wert aus Initialisierung für nicht verwendete Elemente.
- resize(size_type n, const value_type & val): Initialisiert nicht verwendete Elemente mit einer Kopie des bereitgestellter Wert.
Boost.Container erweitert diese Funktionalität um eine zusätzliche Überladung:
- resize(size_type n, default_init_t): Führt eine Standardinitialisierung für nicht verwendete Elemente durch.
Um das Verhalten dieser Funktionen zu überprüfen, wurde ein Test mit C 11 durchgeführt std::vector und boost::container::vector:
- Gefüllte Vektoren mit Werten [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
- Einige Elemente entfernt, um Vektoren mit der gewünschten Größe zu erstellen [0, 1, 2, 3, 4].
- Größe der Vektoren auf 10 Elemente mithilfe unterschiedlicher resize()-Überladungen geändert.
- Die aktualisierten Vektoren wurden gedruckt.
Erwartetes Verhalten
Für den C 03 std::vector sollten die nicht verwendeten Elemente vorhanden sein mit Nullen initialisiert. Es wurde erwartet, dass die boost::container-Varianten das Verhalten von C 03 emulieren, wenn sie im C 03-Modus kompiliert werden, und ein anderes Verhalten zeigen, wenn sie im C 11-Modus kompiliert werden.
Tatsächliche Ergebnisse
Überraschenderweise zeigten die Testergebnisse, dass sowohl std::vector und boost::container::vector zeigte das gleiche Verhalten. In allen Fällen wurden die nicht verwendeten Elemente mit Nullen initialisiert, unabhängig von der verwendeten resize()-Überladung.
Erklärung
Dieses unerwartete Verhalten deutet darauf hin, dass die resize()-Schnittstelle Die in C 11 eingeführte Änderung hat im gegebenen Szenario keine praktische Auswirkung. Die C 03 std::vector::resize()-Funktion initialisiert standardmäßig nicht verwendete Elemente. In C 11 bieten die resize()-Überladungen zusätzliche Optionen für die explizite Initialisierung, sie ändern jedoch nicht das Standardverhalten der Standardinitialisierung nicht verwendeter Elemente. Das gleiche Verhalten spiegelt sich in der Boost.Container-Implementierung wider.
Auswirkungen
Wenn Sie vermeiden müssen, nicht verwendete Elemente mit Nullen zu initialisieren, können Sie einen benutzerdefinierten Allokator verwenden, der die Methode „construct()“ von std::allocator abfängt und die Wertinitialisierung durch die Standardinitialisierung ersetzt. Gehen Sie jedoch mit Vorsicht vor, da die Anwendung dieser Vorgehensweise auf alle Initialisierungen zu unbeabsichtigten Folgen führen kann.
Das obige ist der detaillierte Inhalt vonWie gehen „std::vector::resize()' von C 11 und „resize()' von Boost.Container mit nicht initialisierten Elementen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!