所以我想在 QVector 中分配 1GB 的数据。到目前为止,我使用这样的东西:
void foo (float* data, size_t size)
{
QVector<float> resultVec;
resultVec.resize(size);
//I do some stuff on the vector
size_t paddingLength = nextPow2(size); //calculates the next highest power 2 two
//the paddingLength in this case is at the moment: 268.435.456
// this results in bad_alloc
resultVec.resize(paddingLength);
}
所以在浮动的情况下,我想保留 1Gb 的空间。这根本不应该是一个问题。我还剩下 11GB 的 RAM。我在程序的另一点尝试了它,它工作得非常好,即使大小约为 4GB。
我的第一个猜测是我没有足够的连续空间,但是当我尝试通过在调整大小之前保留空间来做同样的事情时,它突然起作用了。
void foo (float* data, size_t size)
{
QVector<float> resultVec;
resultVec.resize(size);
//I do some stuff on the vector
size_t paddingLength = nextPow2(size); //calculates the next highest power 2 two
//the paddingLength in this case is at the moment: 268.435.456
//this works tho
resultVec.reserve(paddingLength);
resultVec.resize(paddingLength);
}
template<typename T>
T nextPow2 (const T val)
{
T result = val;
for (size_t i = 1; i < sizeof(T) * CHAR_BIT; i *= 2)
{
result |= result >> i;
}
return result + 1;
}
仅供参考:我确实检查了 next2Pow 的返回值,我确信它小于 int 的限制。如评论中所示,我的值略高于 2.68 亿个元素,其中 int 最多超过 20 亿个,所以我在那里应该是安全的。我在上面包含了我的 next2pow 实现。
我做错了什么,或者这种行为是意料之中的吗?