考虑以下代码段:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
显然,它将在大多数平台上崩溃,因为默认堆栈大小通常小于20MB。
现在考虑以下代码:
#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
。