管理矢量分配的内存

时间:2017-01-23 15:21:48

标签: c++ vector containers

(这个问题可以扩展到其他容器)

我可以使用向量来存储大量数据,然后知道如果我没有大量内存,c ++如何管理对此容器的赋值非常重要。

a)当对一个返回向量的函数进行赋值时,该向量上的数据会在赋值后立即清除,或者一直保留到最后一刻才能接收新数据?

b)如果数据被立即销毁,在功能处理过程中哪个状态向量构建新数据?

b.1)如果数据保留了,那意味着我可以在内存中有两个巨大的向量(旧数据和新数据),直到分配完成(返回)?

c)移动语义怎么样?它试图使用已经创建的空间? (如果数据没有像第一个问题中的要求那样立即销毁)

为了更好地展示它,我写了一个小程序:

#include <vector>
#include <string>

using namespace std;

vector<string> func2() {
    vector<string> f2(200000, string(20,'a'));
    return f2;
}

vector<string> func4() {
    vector<string> f4(400000, string(40,'b'));
    //Now I have in memory 400000X40 + 200000X20?
    return f4;
    //after assignment I know I have just f4 content
}

vector<string> func1() {
    vector<string> f1(100000, string(10,'c'));
    return f10;
}

int main() {
    vector<string> mVec;

    mVec = func2(); //Create internally a vector with 20 units string with 20 'b' inside

    mVec = func4(); //Create internally a vector with 40 units string with 40 'b' inside

    mVec = func1(); //Create internally a vector with 10 units string with 10 'b' inside

    return 0;
}

如果移动语义确实使用现有空间,当mVec具有较少数据并且需要分配更多(func2到func4)或反之亦然(func4到func1)时它是如何工作的。

1 个答案:

答案 0 :(得分:2)

当调用func4()时,就在return语句之前,你肯定有两个大的向量。你将它们留在记忆中直到分配点。

对于c),vector是一个连续的容器,所以当你创建新的vector时,它将作为一个整体存储在内存中,而不是内存块1中的一个部分和内存块127中的另一个部分(仅作为示例)

我的建议是,通过引用使用传递向量(将被重新填充),并在填充之前正确调整大小,这样就可以避免整个向量的对齐。

代码示例(优化建议):

#include <vector>
#include <algorithm>    // std::fill
#include <string>

using namespace std;

void func2(vector<string>& vec) {
    vec.resize(200000);
    fill(vec.begin(), vec.end(), string(20, 'a'));
}

void func4(vector<string>& vec) {
    vec.resize(400000);
    fill(vec.begin(), vec.end(), string(40, 'b'));
}

void func1(vector<string>& vec) {
    vec.resize(100000);
    fill(vec.begin(), vec.end(), string(10, 'c'));
}

int main() {
    vector<string> mVec;

    func2(mVec); //Create internally a vector with 20 units string with 20 'b' inside

    func4(mVec); //Create internally a vector with 40 units string with 40 'b' inside

    func1(mVec); //Create internally a vector with 10 units string with 10 'b' inside

    return 0;
}