Рассмотрим следующий фрагмент:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Очевидно, что это приведет к сбою на большинстве платформ, поскольку размер стека по умолчанию обычно составляет менее 20 МБ.
Теперь рассмотрим следующий код:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
Удивительно, но и вылетает! Трассировка (с одной из последних версий libstdc ++) приводит к include/bits/stl_uninitialized.h
файлу, где мы можем видеть следующие строки:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
Конструктор изменения размера vector
должен инициализировать элементы по умолчанию, и вот как это реализовано. Очевидно, _ValueType()
временный сбой стека.
Вопрос в том, соответствует ли это реализации. Если да, то это на самом деле означает, что использование вектора огромных типов довольно ограничено, не так ли?
std::allocator
.