0

所以我想在 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 实现。

我做错了什么,或者这种行为是意料之中的吗?

4

0 回答 0