C++ vector max_size();

Kun*_*dan 14 c++ vector max-size

在32位系统上.

  1. std::vector<char>::max_size()返回2 32 -1,大小为char-1字节
  2. std::vector<int>::max_size()返回2 30 -1,大小为int-4字节
  3. std::vector<double>::max_size()返回2 29 -1,大小为double- 8字节

任何人都可以告诉我max_size()取决于什么?

max_size()如果它在64位系统上运行,它的返回值是多少?

Ant*_*ams 21

max_size()是可以放在向量中的理论最大项目数.在32位系统上,理论上可以分配4Gb == 2 ^ 32,即2 ^ 32 char值,2 ^ 30 int值或2 ^ 29 double值.您的实现似乎正在使用该值,但减去1.

当然,你永远不可能真正分配一个大的矢量; 很久以前你就会耗尽内存.

除了max_size()不能分配大于该值的向量之外,没有要求返回什么值.在64位系统上,它可能返回2 ^ 64-1 char,或者它可能返回一个较小的值,因为系统只有有限的内存空间.64位PC通常仅限于48位地址空间.

  • “...在那之前你就会耗尽内存。”我意识到这是在 2010 年写的,但即便如此,4GiB RAM 模块也非常常见。如今,大多数计算机的_最小_容量为 16GiB。我觉得这个广告词应该被删除。另外:“无论如何,64 位 PC 通常仅限于 48 位地址空间。”这仍然准确吗?我认为现在英特尔处理器使用 _52_ 物理地址线。 (3认同)
  • “RAM 耗尽”评论是关于 32 位地址空间的。可能有一些 CPU 具有 52 位地址空间;我知道 Intel 提出了 57 位寻址模型,但我坚持这样的说法:它们“通常”仅限于 48 位 (2认同)

小智 11

只需通过以下方式获得答案

std::vector<dataType> v;
std::cout << v.max_size();
Run Code Online (Sandbox Code Playgroud)

或者我们可以通过 得到答案(2^nativePointerBitWidth)/sizeof(dataType) - 1。例如,在 64 位系统上,long long(通常)是 8 字节宽,所以我们有(2^64)/8 - 1 == 2305843009213693951.


Vla*_*mir 8

max_size()返回

由于系统或库实现限制,向量可能达到的最大可能大小.

所以我认为最大值是依赖于实现的.在我的机器上有以下代码

std::vector<int> v;
cout << v.max_size();
Run Code Online (Sandbox Code Playgroud)

产生输出:

4611686018427387903 // built as 64-bit target
1073741823 // built as 32-bit target
Run Code Online (Sandbox Code Playgroud)

所以公式2 ^(64-大小(类型)) - 1看起来也适用于那种情况.