Rozważ następujący fragment kodu:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Oczywiście ulegnie awarii na większości platform, ponieważ domyślny rozmiar stosu jest zwykle mniejszy niż 20 MB.
Teraz rozważ następujący kod:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Co zaskakujące, również się zawiesza! Tracback (z jedną z najnowszych wersji libstdc ++) prowadzi do include/bits/stl_uninitialized.h
pliku, w którym możemy zobaczyć następujące linie:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
Konstruktor zmiany rozmiaru vector
musi domyślnie zainicjować elementy i w ten sposób jest implementowany. Oczywiście _ValueType()
tymczasowe awarie stosu.
Pytanie brzmi, czy jest to zgodna implementacja. Jeśli tak, to w rzeczywistości oznacza to, że użycie wektora ogromnych typów jest dość ograniczone, prawda?
std::allocator
używana jest wartość domyślna .