Heim >Backend-Entwicklung >C++ >Führt die Schnittstellenänderung „std::vector::resize()' von C 11 zu einer effektiven Wertinitialisierung neuer Elemente?

Führt die Schnittstellenänderung „std::vector::resize()' von C 11 zu einer effektiven Wertinitialisierung neuer Elemente?

DDD
DDDOriginal
2024-12-26 14:11:14395Durchsuche

Does C  11's `std::vector::resize()` Interface Change Effectively Value-Initialize New Elements?

Untersuchung des Verhaltens von std::vector::resize() und Boost.Container's resize()

In C 03 std::vector: :resize() initialisiert neu zugewiesene Elemente mit Kopien des bereitgestellten Werts. Mit C 11 wurden Überladungen eingeführt, um die Initialisierung von Werten oder die Initialisierung per Kopie zu ermöglichen.

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!

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