【问题标题】:Is there a size limit on the length of a std::array?std::array 的长度是否有大小限制?
【发布时间】:2020-05-20 06:06:27
【问题描述】:

如果我尝试在使用 g++ 7.3.1 编译的 Centos 7.6 系统上实例化一个大型二维 std::array,我会遇到分段错误:

int main()
{
    const unsigned NUM_BUFFERS = 200;
    const unsigned BUFFER_SIZE_BYTES = 1024 * 1024;

    std::array<std::array<unsigned char, BUFFER_SIZE_BYTES>, NUM_BUFFERS> buffer;
}

给予:

$ ./main
Segmentation fault (core dumped)

std::array 的长度是否有大小限制?

我已经在堆栈上声明了这个数组,但大概存储在空闲存储上。这里有什么问题?

【问题讨论】:

  • “大概存储在免费商店”也许是时候挑战这个假设了。
  • 函数内部的局部变量通常存储在堆栈中。对于数组也是如此,包括旧的 C 样式数组以及 std::array 对象。堆栈是有限的资源;例如在Linux 进程的默认堆栈是 8MiB。您尝试创建一个 200MiB 的数组。
  • @DavidA 不,您似乎想要的是std::vector。如std::vector&lt;std::vector&lt;uint8_t&gt;&gt; buffer(NUM_BUFFERS, std::vector&lt;uint8_t&gt;(BUFFER_SIZE_BYTES));
  • @juanchopanza 我正在编辑代码 sn-p 以显示它在堆栈上。

标签: c++ c++11 gcc


【解决方案1】:

你遇到了堆栈溢出。

std::array 就地分配,堆栈空间通常非常有限(例如,在 Windows 上为 1MB,在 Linux 上为 4-8 MB)。

改用std::vector,它在堆上分配。

【讨论】:

  • 值得注意的是,在这种情况下,std::vectorstd::arrays 可能是最好的方法。
  • @Sneftel 关于数组的向量:最近在 SO 上遇到了 libstdc++ 的实现质量问题,即向量的元素大小可能导致堆栈溢出。因此,如果行在兆字节范围内,那么使用向量的向量会更安全。
  • 或者只是数组的std::unique_ptr。这也可以是默认初始化的。
  • @eerorika Bleh。谢谢,给我的消息。
【解决方案2】:

std::array 的长度是否有大小限制?

对象大小的限制由实现定义。该标准规定了所需的最小限制如下,但大多数实现可能支持更大的对象(最多可用内存):

[限制]

对象的大小 ([intro.object]) [262 144]。


我已经在堆栈上声明了这个数组,但大概存储在空闲存储上

你猜错了。 std::array 不会从空闲存储区分配任何内容,而是将数组作为成员。

这里出了什么问题?

堆栈溢出。

执行堆栈的大小取决于实现。在桌面系统上,堆栈的默认大小是 1 到几兆字节。每个函数调用的所有自动变量都必须适合这个空间。

为避免此限制,请动态分配数组(例如使用std::make_uniquestd::vector)。

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 2013-10-06
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多