对 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

我有两个问题:

  1. 为什么最大值这么小?它看起来像 uint32 的最大值。我期待它更多在 size_t 的 运行ge,应该是 18446744073709551615,对吧?
  2. 当我的矢量超过 2147483648(即规定最大值的一半)值时,为什么我得到 vector<T> too long

[编辑]

部分回复:

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_tPRIdMAX 宏扩展为 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 不一定要考虑此类系统限制,这是理论上的限制,在实践中通常无法实现。