【发布时间】:2020-05-18 18:04:00
【问题描述】:
在一个在线课程中,我正在学习矢量。在其中一个示例中,他们解释说: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 个整数。
所以我开始用谷歌搜索它。 Here 我读到它返回“容器可以达到的最大潜在大小”,并补充说“但绝不保证容器能够达到那个大小”。我会想象它会失败,但不会失败。在失败之前它只完成了 1/5。为什么std::vector::max_size 如此关闭?我认为更重要的是,有没有办法真正知道向量的潜在大小?
【问题讨论】:
-
向量中的元素个数与大小不同。 sizeof 以字节为单位
-
最大可实现大小取决于您有多少可用 RAM,并且您可用的 RAM 量可能在一毫秒之间变化很大(因为其他程序会分配和释放 RAM 块);因此,没有简单的方法可以返回一个有意义的值,即向量可能此时在您的硬件上能够增长多大
-
max_size()用于容器很奇怪,而且不是特别有用。事后看来,它可能不应该存在。 -
@JeremyFriesner:RAM 应该是虚拟内存,对吧? RAM 的数量并不重要,只是程序会因为交换而变慢。
-
@ThomasWeller 我使用的许多计算机都故意配置为没有任何交换空间,因为由于交换而无法跟上其任务负载的计算机甚至不如必须在某些进程上调用 OOM-killer 以恢复 RAM。至少在后一种情况下,被杀死的进程可以自动重生,然后可以在没有人工干预的情况下恢复有用的工作。所以我认为 RAM 的数量绝对很重要 :)