C++学习(15)

#学习自用#

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不支持,运行时会报错。

  • 23
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值