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" 的存在。它是一个特定于实现的概念。因此,发生什么取决于实现。如果幸运的话,程序会崩溃。如果你运气不好,你的秘密会泄露给黑客。
我正在使用 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" 的存在。它是一个特定于实现的概念。因此,发生什么取决于实现。如果幸运的话,程序会崩溃。如果你运气不好,你的秘密会泄露给黑客。