声明一个数组,该数组的指针在可用RAM的范围内



我想使用指针创建一个数组,但我想将其容量设置为最大可用RAM。我测试过这种方法:

void init() 
{
long  maxSize = 0x7fffffff;
long capacity = maxSize / sizeof(int);
int* _array = new int[capacity];
}

但是这个方法失败了,在运行时给了我这个错误:

0x7651A6E2处未处理的异常:内存位置0x012FF780处的Microsoft C++异常: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';

最新更新