【问题标题】:C++ vector max_size();C++ 向量 max_size();
【发布时间】:2011-04-18 07:22:20
【问题描述】:

在 32 位系统上。

  1. std::vector<char>::max_size() 返回 232-1,char 的大小 — 1 字节
  2. std::vector<int>::max_size() 返回 230-1,大小为 int — 4 字节
  3. std::vector<double>::max_size() 返回 229-1,大小为 double — 8 字节

谁能告诉我max_size() 取决于什么?

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

【问题讨论】:

    标签: c++ vector max-size


    【解决方案1】:

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

    当然,你永远不可能在 32 位系统上真正分配这么大的向量。在那之前你会用完内存。

    对于max_size() 返回的值没有任何要求,除非您不能分配大于该值的向量。在 64 位系统上,它可能为 char 返回 2^64-1,或者它可能返回较小的值,因为系统只有有限的内存空间。无论如何,64 位 PC 通常被限制为 48 位地址空间。

    【讨论】:

    • ...you'll run out of memory long before then. 我知道这是在 2010 年编写的,但即便如此,4GiB RAM 模块也非常普遍。如今,大多数计算机的最低为 16GiB。我觉得这个宣传应该被删除。另外:64-bit PCs are often limited to a 48-bit address space anyway. 这仍然准确吗?我认为英特尔处理器现在使用 52 条物理地址线。
    • “RAM 用尽”注释与 32 位地址空间有关。可能有一些 CPU 具有 52 位地址空间;我知道英特尔提出了一个 57 位寻址模型,但我坚持他们“经常”限制为 48 位的说法
    【解决方案2】:

    max_size() 返回

    向量的最大潜在大小 可能由于系统或库而到达 实施限制。

    所以我认为最大值取决于实现。在我的机器上,下面的代码

    std::vector<int> v;
    cout << v.max_size();
    

    产生输出:

    4611686018427387903 // built as 64-bit target
    1073741823 // built as 32-bit target
    

    所以公式 2^(64-size(type))-1 在这种情况下看起来也是正确的。

    【讨论】:

      【解决方案3】:

      只需通过

      得到答案
      std::vector<dataType> v;
      std::cout << v.max_size();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 2011-04-21
        • 2011-07-01
        相关资源
        最近更新 更多