Considere el siguiente fragmento:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Obviamente, se bloqueará en la mayoría de las plataformas, porque el tamaño predeterminado de la pila suele ser inferior a 20 MB.
Ahora considere el siguiente código:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
¡Sorprendentemente también se bloquea! El rastreo (con una de las versiones recientes de libstdc ++) conduce al include/bits/stl_uninitialized.h
archivo, donde podemos ver las siguientes líneas:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
El cambio de tamaño vector
constructor de debe inicializar por defecto los elementos, y así es como se implementa. Obviamente, _ValueType()
temporal bloquea la pila.
La pregunta es si se trata de una implementación conforme. En caso afirmativo, en realidad significa que el uso de un vector de tipos enormes es bastante limitado, ¿no es así?
std::allocator
se usa el predeterminado .