std::array 大小的类型是什么?如果大小大于堆栈上的可用大小,是否会抛出异常?

What is the type of the size of std::array and if the size is bigger than what's available on the stack, does it throw an exception?

我正在使用 MSVC++。

如果我定义一个 std::array 并且尺寸大于 2^31 - 1 我会得到这个错误:

C2148 total size of array must not exceed 0x7fffffff bytes

这让我推断出大小的类型是带符号的 32 位整数。但是为什么使用带符号的整数来表示大小呢?既然没有负尺寸,如果尺寸能达到0xffffffff岂不是更好?

这是发生在我身上的一件有趣的事情:

如果我声明一个大小为 10000000024 的 std::array,我会得到上面的错误。但是如果我让大小为 10000000024 * 64 程序编译没有任何问题。

这让我想到了两个问题:

1 - 为什么会这样?

2 - 我认为堆栈没有那么大,无法容纳该大小的数组。例如,如果数组很大,它是否分配在堆上?如果不是,如果数组的大小确实超过堆栈的大小会发生什么?它会抛出异常吗?

What is the type of the size of std::array

它是 std::size_t,其中 是一个实现定义的无符号整数类型,它足够大以包含任何对象的字节大小

1 - why is this happening?

根据消息,发生这种情况是因为 "total size of array must not exceed 0x7fffffff bytes"。这似乎是该特定语言实现的限制。

对于它的价值,C++ 标准建议将 0x40000 作为对象最大大小的最小限制的指导建议。 0x7fffffff 大大超过了该建议。在 x86-64 Linux 系统上,对象的最大大小限制为 0x7fffffffffffffff。

Is the array allocated on the heap if it's big for example?

对象的内存分配位置取决于您使用的存储类型以及语言的实现。对象的大小通常不会影响这一点。 std::array 从不分配任何动态内存。

what happens if the size of the array does exceed the size of the stack?

执行堆栈的大小如何超出无关紧要。该语言没有具体说明会发生什么,也没有承认 "stack" 的存在。它是一个特定于实现的概念。因此,发生什么取决于实现。如果幸运的话,程序会崩溃。如果你运气不好,你的秘密会泄露给黑客。