Рассмотрим следующий фрагмент:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
Очевидно, что на большинстве платформ он будет иметь sh, поскольку размер стека по умолчанию обычно меньше 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()
временно разрушает стек.
Вопрос в том, является ли это соответствующей реализацией. Если да, то это на самом деле означает, что использование вектора огромных типов весьма ограничено, не так ли?