Розглянемо наступний фрагмент:
#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
.