Considera il seguente frammento:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Ovviamente si bloccherebbe sulla maggior parte delle piattaforme, perché la dimensione dello stack predefinita è generalmente inferiore a 20 MB.
Ora considera il seguente codice:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Sorprendentemente si blocca anche! Il traceback (con una delle versioni libstdc ++ recenti) porta al include/bits/stl_uninitialized.h
file, dove possiamo vedere le seguenti righe:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
Il vector
costruttore di ridimensionamento deve inizializzare per default gli elementi, ed è così che viene implementato. Ovviamente, il _ValueType()
crash temporaneo dello stack.
La domanda è se si tratta di un'implementazione conforme. Se sì, in realtà significa che l'uso di un vettore di tipi enormi è piuttosto limitato, non è vero?
std::allocator
viene utilizzato il valore predefinito .