对 std::vector 的最大大小感到困惑
confused about max size of std::vector
我 运行 在我的代码中遇到了一个问题 std::vector,给我:vector<T> too long
。在这种情况下,我使用的是 char 向量。该代码正在处理 3D(断层扫描)图像,所以我有很多体素。我在 windows 使用 VS 编译器时遇到的问题与在 Mac 使用 CLANG 时遇到的问题完全相同,尚未测试 gcc。
为了检查这个问题,我添加了以下几行:
printf("max vector size %u\n", v.max_size() );
printf("PTRDIFF_MAX %u, INTMAX_MAX %u\n", PTRDIFF_MAX, INTMAX_MAX );
哪个给了我:
max vector size 4294967295
PTRDIFF_MAX 4294967295, INTMAX_MAX 4294967295
我有两个问题:
- 为什么最大值这么小?它看起来像 uint32 的最大值。我期待它更多在 size_t 的 运行ge,应该是 18446744073709551615,对吧?
- 当我的矢量超过 2147483648(即规定最大值的一半)值时,为什么我得到
vector<T> too long
?
[编辑]
部分回复:
感谢您指出我的 printf 错误。我已经转换为 std::cout,现在我得到(这在 64 位系统上更有意义):
max_size: 9223372036854775807
PTRDIFF_MAX: 9223372036854775807
INTMAX_MAX: 9223372036854775807
错误vector<T> too long
是运行时错误
我将其追溯到调整矢量大小的行
当我使用 uint32_t 的向量而不是 char 时,问题出现在相同的向量长度(内存使用量的 4 倍)。
我有足够的 RAM,但是,我不知道在调整大小请求时分配是如何工作的。也许,没有足够大的连续 RAM 块可用?
Why is the max value so small? it looks like the max of an uint32.
这在 32 位系统上是正常的。
I was expecting it to be more in the range of size_t, which should be 18446744073709551615, right?
如果PTRDIFF_MAX
是4294967295,那么我觉得很奇怪SIZE_MAX
会和18446744073709551615一样多。也就是说,我也会觉得奇怪PTRDIFF_MAX
是4294967295。
您看到令人惊讶且毫无意义的输出,因为程序的行为未定义,这是因为您使用了错误的格式说明符。 %u
适用于 unsigned int,且仅适用于 unsigned int。 %td
说明符用于 std::ptrdiff_t
,PRIdMAX
宏扩展为 std::intmax_t
的说明符,%zu
用于 std::size_t
.
我建议学习使用 C++ iostream。使用它们并不像使用 C 标准时那样容易意外导致未定义的行为 I/O.
Why am I getting the vector too long when my vector surpasses 2147483648 (i.e. half the stated maximum) number of values?
我不知道“向量太长”是什么意思,但通常情况下您没有整个地址 space 可用于您的程序。很有可能一半留给内核。
max_size
不一定要考虑此类系统限制,这是理论上的限制,在实践中通常无法实现。
我 运行 在我的代码中遇到了一个问题 std::vector,给我:vector<T> too long
。在这种情况下,我使用的是 char 向量。该代码正在处理 3D(断层扫描)图像,所以我有很多体素。我在 windows 使用 VS 编译器时遇到的问题与在 Mac 使用 CLANG 时遇到的问题完全相同,尚未测试 gcc。
为了检查这个问题,我添加了以下几行:
printf("max vector size %u\n", v.max_size() );
printf("PTRDIFF_MAX %u, INTMAX_MAX %u\n", PTRDIFF_MAX, INTMAX_MAX );
哪个给了我:
max vector size 4294967295
PTRDIFF_MAX 4294967295, INTMAX_MAX 4294967295
我有两个问题:
- 为什么最大值这么小?它看起来像 uint32 的最大值。我期待它更多在 size_t 的 运行ge,应该是 18446744073709551615,对吧?
- 当我的矢量超过 2147483648(即规定最大值的一半)值时,为什么我得到
vector<T> too long
?
[编辑]
部分回复:
感谢您指出我的 printf 错误。我已经转换为 std::cout,现在我得到(这在 64 位系统上更有意义):
max_size: 9223372036854775807 PTRDIFF_MAX: 9223372036854775807 INTMAX_MAX: 9223372036854775807
错误
vector<T> too long
是运行时错误我将其追溯到调整矢量大小的行
当我使用 uint32_t 的向量而不是 char 时,问题出现在相同的向量长度(内存使用量的 4 倍)。
我有足够的 RAM,但是,我不知道在调整大小请求时分配是如何工作的。也许,没有足够大的连续 RAM 块可用?
Why is the max value so small? it looks like the max of an uint32.
这在 32 位系统上是正常的。
I was expecting it to be more in the range of size_t, which should be 18446744073709551615, right?
如果PTRDIFF_MAX
是4294967295,那么我觉得很奇怪SIZE_MAX
会和18446744073709551615一样多。也就是说,我也会觉得奇怪PTRDIFF_MAX
是4294967295。
您看到令人惊讶且毫无意义的输出,因为程序的行为未定义,这是因为您使用了错误的格式说明符。 %u
适用于 unsigned int,且仅适用于 unsigned int。 %td
说明符用于 std::ptrdiff_t
,PRIdMAX
宏扩展为 std::intmax_t
的说明符,%zu
用于 std::size_t
.
我建议学习使用 C++ iostream。使用它们并不像使用 C 标准时那样容易意外导致未定义的行为 I/O.
Why am I getting the vector too long when my vector surpasses 2147483648 (i.e. half the stated maximum) number of values?
我不知道“向量太长”是什么意思,但通常情况下您没有整个地址 space 可用于您的程序。很有可能一半留给内核。
max_size
不一定要考虑此类系统限制,这是理论上的限制,在实践中通常无法实现。