首页 > 解决方案 > 我怎样才能知道向量的实际最大大小?(不使用 std::vector::max_size)

问题描述

在一个在线课程中,我正在学习向量。在其中一个示例中,他们解释说:std::vector::max_size()应该给我向量可以达到的最大大小。我决定测试一下:

#include <iostream>
#include <exception>
#include <vector>

int main(void) {
    std::vector <int> nums;
    int max = nums.max_size();
    std::cout << "Max: " << max << std::endl;
    for (int i = 0; i < max; i++) {
        try {
            nums.push_back(i);
        }
        catch (std::bad_alloc ex) {
            std::cerr << ex.what() << std::endl;
            std::cout << "Failed at: " << i << std::endl;
            break;
        }
    }

    return 0;
}

这是运行它的结果:

Max: 1073741823
bad allocation
Failed at: 204324850

它短了 869416973 个整数。

所以我开始用谷歌搜索它。在这里,我读到它返回“容器可以达到的最大潜在大小”,并添加了“但绝不保证容器能够达到那个大小”。我会想象它会失败,但不会那么失败。在失败之前它只完成了 1/5。为什么std::vector::max_size这么偏?我认为更重要的是,有没有办法真正知道向量的潜在大小?

标签: c++vector

解决方案


请注意,该max_size函数返回理论上的最大元素数,它没有说明所需的内存量。

如果我们假设sizeof(int) == 4(很常见)那么204324850元素将需要817299400字节的连续内存(几乎是 780 MiB)。

你会得到一个bad_alloc例外,因为向量根本无法分配足够的内存来保存所有元素。


推荐阅读