Heim >Backend-Entwicklung >C++ >Führt die Schnittstellenänderung „std::vector::resize()' von C 11 zu einer effektiven Wertinitialisierung neuer Elemente?
In C 03 std::vector
Unter Verwendung des Vektors von Boost.Container, der drei resize()-Überladungen ähnlich wie C 11 unterstützt, wurde ein Test durchgeführt, um das Verhalten zu überprüfen. Im C 03-Modus verhielten sich sowohl std::vector als auch der Boost.Container-Vektor wie erwartet und initialisierten neue Elemente mit Nullen.
Im C 11-Modus wurden jedoch sowohl std::vector als auch der Boost.Container-Vektor weiterhin initialisiert neue Elemente mit Nullen, wenn die für die Wertinitialisierung vorgesehene Überladung verwendet wird. Dies wirft die Frage auf:
Ist die C 11 std::vector::resize()-Schnittstellenänderung tatsächlich wirksam?
Die Ergebnisse deuten darauf hin, dass die Schnittstellenänderung nicht die beabsichtigte Wirkung hatte, da In beiden Implementierungen werden noch neue Elemente initialisiert.
Nachtrag
Um das zu beheben Aufgrund der Einschränkungen des vorhandenen Allokators wurde ein alternativer Allokatoradapter vorgeschlagen, der eine sicherere und zuverlässigere Möglichkeit bietet, eine Wertinitialisierung zu erreichen, ohne alle Arten von Elementen zu initialisieren:
template <typename T, typename A=std::allocator<T>> class default_init_allocator : public A { // ... implementation };
Dieser Adapter schaltet bei construction()-Aufrufen ein value-initialization und wandelt sie in Standardinitialisierungsaufrufe um. Es verarbeitet auch die Standardinitialisierung korrekt.
Das obige ist der detaillierte Inhalt vonFührt die Schnittstellenänderung „std::vector::resize()' von C 11 zu einer effektiven Wertinitialisierung neuer Elemente?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!