c++ - 在可用 RAM 的范围内声明一个带有指针的数组
问题描述
我想使用指针创建一个数组,但我想将其容量设置为最大可用 RAM。我已经测试过这种方法:
void init()
{
long maxSize = 0x7fffffff;
long capacity = maxSize / sizeof(int);
int* _array = new int[capacity];
}
但是此方法失败并在运行时给我这个错误:
0x7651A6E2 处未处理的异常:Microsoft C++ 异常:内存位置 0x012FF780 处的 std::bad_alloc。
那么如何以最大可用大小分配我的数组呢?
解决方案
您应该明白,如果您有 10 GB 的空闲 RAM,并不意味着您可以分配 10 GB 的数组。想象一下,该字母e
表示一个空的千兆字节,而该字母b
表示一个忙碌的千兆字节。在现实生活中,您的 RAM 看起来像这样
eebeebbeeebeebe
我们可以注意到,这里有 10 GB 是空闲的,但我们不能在 10 GB 上分配一个数组(别忘了,数组元素在存储中是一致的)。所以我可以建议的唯一方法是检查尺寸,直到找到最大的免费。
所以你的代码可能看起来像这样(但注意std::realloc
,你可以通过使用而不是new
+来提高大小delete
,我正在使用二进制搜索来提高性能)
size_t min = 0;
size_t max = std::numeric_limits<size_t>::max();
int *ptr = new int[min];
while (max - min > 1)
{
size_t middle = (max - min) / 2 + min;
try
{
int *temp = new int[middle];
min = middle;
delete[] ptr;
ptr = temp;
}
catch (const std::exception &e)
{
max = middle;
continue;
}
}
std::cout << "max_size is " << min << '\n';
推荐阅读
- python - 使 tkinter 窗口在全屏应用程序之上绘制
- python - 如何绕过 Google API 网站身份验证流程
- node.js - 我将如何对剩余的未分组参数进行分组?
- mysql - 如果 group_concat 不返回值,解决方法是什么
- html - 是否应该将 preconnect 与样式表一起使用?
- http - 将 URL 查询参数解析为结构时,“form”是否是可接受的结构标记?
- discord - Discord Bot 可以有通知 SFX 吗?
- swiftui - “在视图更新期间修改状态,这将导致未定义的行为”的奇怪问题
- python - 尝试使用烧瓶主体来限制对特定网页的访问
- snowflake-cloud-data-platform - SQL 根据列字符串值计算不同的用户 ID