Heim >Backend-Entwicklung >C++ >Wird der Wert von „std::vector::resize()' von C 11 und „boost::container::vector::resize()' von Boost.Container immer wie erwartet initialisiert?
Verhält sich Vector::resize() in C 11 und Boost.Container wie erwartet?
In C 03 ist der std:: Die Funktion vector::resize() hatte nur eine Überladung, die neue Elemente mit einem bestimmten Wert initialisieren konnte. C 11 führte zwei Überladungen ein: resize(size_type n) für die Wertinitialisierung und resize(size_type n, const value_type &val) für die Kopierinitialisierung.
Boost.Container's boost::container::vector unterstützt auch die Wertinitialisierung in seiner resize()-Methode. Nach dem Testen des Verhaltens von std::vector von C 11 und boost::container::vector von Boost.Container wurde jedoch festgestellt, dass die letzten zu den Vektoren hinzugefügten Elemente immer noch mit Nullen initialisiert wurden, obwohl die Verwendung beabsichtigt war Wertinitialisierung.
Das erwartete Verhalten verstehen:
Wert Initialisierung bedeutet, dass neue Elemente mit ihren Standardwerten initialisiert werden sollten (z. B. 0 für Ganzzahlen), während Kopierinitialisierung bedeutet, dass neue Elemente mit Kopien des bereitgestellten Werts initialisiert werden sollten.
Testergebnisse:
Der folgende Code wurde verwendet, um das Verhalten zu testen:
int main() { // Initialize vectors std::vector<int> std_vec; bc::vector<int> boost_vec; bc::vector<int> boost_vec_default; // Fill and resize vectors init_vec(std_vec); init_vec(boost_vec); init_vec(boost_vec_default); // Resize vectors to 10 elements using different techniques std_vec.resize(10); boost_vec.resize(10); boost_vec_default.resize(10, bc::default_init); // Print results print_vec("std", std_vec); print_vec("boost", boost_vec); print_vec("boost w/default", boost_vec_default); }
Kompilieren in C 03-Modus:
Die Ausgabe im C 03-Modus ist wie erwartet. Neue Elemente in std_vec und boost_vec werden mit Nullen initialisiert, während Elemente in boost_vec_default standardmäßig initialisiert werden.
Kompilieren im C 11-Modus:
Die Ausgabe in C Der 11-Modus zeigt, dass neue Elemente sowohl in std_vec als auch in boost_vec immer noch mit Nullen initialisiert werden. Dies weist darauf hin, dass das erwartete Verhalten von resize(size_type n) nicht erfüllt wird.
Erklärung:
Der Grund für dieses unerwartete Verhalten ist, dass der Compiler möglicherweise eine Optimierung durchführt den Aufruf der Wertinitialisierungsüberladung von resize() aus. Um die Wertinitialisierung zu erzwingen, kann ein Allokator verwendet werden, der die Methode „construct()“ überschreibt, um die Wertinitialisierung explizit durchzuführen.
Das obige ist der detaillierte Inhalt vonWird der Wert von „std::vector::resize()' von C 11 und „boost::container::vector::resize()' von Boost.Container immer wie erwartet initialisiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!