c++ - std::vector (ab) 使用自动存储

标签 c++ language-lawyer stdvector libstdc++ automatic-storage

考虑以下片段:

#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/

相关文章:

c++ - 为什么人们会在声明范围之外使用 lambda 或从声明范围调用的函数?

c++ - 动态创建 std::vector//创建指向 vector 的指针

c++ - 是否可以使用索引迭代器访问另一个数组的索引?

c++ - 直接从指针/地址访问数组的元素

c++ - 函数调用缺少参数列表错误

c - 指向数组的指针与指向 'const' 数组的指针不兼容?

c++ - 我可以扩展一个参数包并用它定义一个参数列表吗?

c++ - 在 Qt 应用程序中使用时出现奇怪的类行为

c++ - 同时文件流是否有限制?

c++ - std::find 用于继承对象 C++