Betrachten Sie das folgende Snippet:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Offensichtlich würde es auf den meisten Plattformen abstürzen, da die Standardstapelgröße normalerweise weniger als 20 MB beträgt.
Betrachten Sie nun den folgenden Code:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Überraschenderweise stürzt es auch ab! Der Traceback (mit einer der neuesten libstdc ++ - Versionen) führt zu einer include/bits/stl_uninitialized.h
Datei, in der die folgenden Zeilen angezeigt werden:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
Der Größenänderungskonstruktor vector
muss die Elemente standardmäßig initialisieren, und so wird er implementiert. Offensichtlich _ValueType()
stürzt der Stapel vorübergehend ab.
Die Frage ist, ob es sich um eine konforme Implementierung handelt. Wenn ja, bedeutet dies tatsächlich, dass die Verwendung eines Vektors großer Typen sehr begrenzt ist, nicht wahr?
std::allocator
verwendet wird.