#学习自用#
Vector使用优化
使用vector导致代码运行变慢的主要原因是容量不够大,需要容纳多余的元素就得重新分配内存,并把之前的内存复制到新的内存中去,再删除旧内存,复制的过程尤其花费时间。
#include<iostream>
#include<vector>
using namespace std;
struct Vertex
{
float x,y,z;
Vertex(float x,float y,float z)
:x(x),y(y),z(z){}
Vertex(const Vertex& e)
{
cout<<"copy"<<endl;
}
};
void main()
{
vector<Vertex> vertices;
vertices.push_back(Vertex(1,2,3));
vertices.push_back(Vertex(4,5,6));
vertices.push_back(Vertex(7,8,9));
cin.get();
}
在添加第一个元素处添加断点进行调试,我们发现在添加第一个元素时就发生了复制,原因是当我们创建vertices实际上驶在主函数的栈上创建的(成员为1,2,3的那个元素),但是我们要把vertices放入vector所创建的内存中,这里从主函数复制到vector类中发生了一次复制。最终这段代码发生了6次复制。
优化一
预设容量,如果已知容量是3。
#include<iostream>
#include<vector>
using namespace std;
struct Vertex
{
float x,y,z;
Vertex(float x,float y,float z)
:x(x),y(y),z(z){}
Vertex(const Vertex& e)
{
cout<<"copy"<<endl;
}
};
void main()
{
vector<Vertex> vertices;//vector<Vertex> vertices(3)
vertices.reserve(3);
vertices.push_back(Vertex(1,2,3));
vertices.push_back(Vertex(4,5,6));
vertices.push_back(Vertex(7,8,9));
cin.get();
}
不能使用vector<Vertex> vertices(3),这串代码不仅仅是分配了3个Vertex的内存还构建了三个对象,但是在这一步我们并不想在这里创建对象,reserve可以确保我们有足够的内存,这里我们将copy次数减少到了三次。
优化二
使用 emplace_back 而不是 push_back ,emplace_back只传递构造函数的参数列表,然后vector内存中使用这些参数构造一个 Vertex 对象,省去了复制的开销。
#include<iostream>
#include<vector>
using namespace std;
struct Vertex
{
float x,y,z;
Vertex(float x,float y,float z)
:x(x),y(y),z(z){}
Vertex(const Vertex& e)
{
cout<<"copy"<<endl;
}
};
void main()
{
vector<Vertex> vertices;
vertices.reserve(3);
vertices.emplace_back(1,2,3);
vertices.emplace_back(4,5,6);
vertices.emplace_back(7,8,9);
cin.get();
}
这里能将copy次数降到0,但是VS2010不支持,运行时会报错。