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?

Wird der Wert von „std::vector::resize()' von C 11 und „boost::container::vector::resize()' von Boost.Container immer wie erwartet initialisiert?

DDD
DDDOriginal
2024-12-09 08:07:06688Durchsuche

Does C  11's `std::vector::resize()` and Boost.Container's `boost::container::vector::resize()` Always Value-Initialize as Expected?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn