c++ - 我怎样才能知道向量的实际最大大小?(不使用 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
这么偏?我认为更重要的是,有没有办法真正知道向量的潜在大小?
解决方案
请注意,该max_size
函数返回理论上的最大元素数,它没有说明所需的内存量。
如果我们假设sizeof(int) == 4
(很常见)那么204324850
元素将需要817299400
字节的连续内存(几乎是 780 MiB)。
你会得到一个bad_alloc
例外,因为向量根本无法分配足够的内存来保存所有元素。
推荐阅读
- r - 如何按时间段总结一个小标题?
- paypal - 在没有服务器后端的静态 HTML/JS 网站上完成 PayPal 付款。如何渲染完成的支付页面?
- java - Java 数组列表
没有按要求工作 - qt - 如何向模型中没有的 QML ComboBox 添加额外的项目?
- python - 使用 Python 的 matplotlib 3D API 的轮廓问题
- typescript - 是否可以使用泛型类型来确定运行时功能?
- winforms - 类中的 Powershell winform 事件处理程序导致范围问题
- angular - 在 Angular Datatable 中隐藏几行
- vb.net - 如何将添加在图片框中的用户控件翻转 180 度?
- assembly - 汇编代码指令“pushq”不能将 64 位的东西压入堆栈?