Considere o seguinte trecho:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Obviamente, ele travaria na maioria das plataformas, porque o tamanho da pilha padrão geralmente é inferior a 20 MB.
Agora considere o seguinte código:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Surpreendentemente, ele também trava! O traceback (com uma das versões recentes do libstdc ++) leva ao include/bits/stl_uninitialized.h
arquivo, onde podemos ver as seguintes linhas:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
O vector
construtor de redimensionamento deve inicializar os elementos por padrão, e é assim que ele é implementado. Obviamente, _ValueType()
falhas temporárias na pilha.
A questão é se é uma implementação em conformidade. Se sim, na verdade significa que o uso de um vetor de grandes tipos é bastante limitado, não é?
std::allocator
for usado.