(这个问题可以扩展到其他容器)
我可以使用向量来存储大量数据,然后知道如果我没有大量内存,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)时它是如何工作的。
答案 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;
}