考虑以下片段:
#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()
临时崩溃堆栈。问题是它是否是一个符合要求的实现。如果是,那实际上意味着大类型 vector 的使用非常有限,不是吗?
最佳答案
任何标准 API 使用的自动存储量没有限制。
它们都可能需要 12 TB 的堆栈空间。
但是,该 API 只需要 Cpp17DefaultInsertable
,并且您的实现会在构造函数所需的内容上创建一个额外的实例。除非它在检测对象之后进行门控是微不足道的可操作和可复制的,否则该实现看起来是非法的。
关于c++ - std::vector (ab) 使用自动存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59618533/