动态数组分配的大小默认为2的n次方1,2,4,8...
在main中创建的vertices,push需要放到Vertex中(copy),下一次copy是因为要调整vertices的大小
vertices.push_back(Vertex(1,2,3));//拷贝 第一次,容量为1,拷贝进去,调用一次
vertices.push_back(Vertex(4,5,6));//拷贝 第二次,容量调整为2(包含了新的数组内容),copy一次,再拷贝旧的容量1到 新的容量为2的数组里面,调用一次 共两次copy
vertices.push_back(Vertex(7,8,9));//拷贝 第三次,容量调整为4包含了新的数组内容),copy一次,拷贝旧的容量2里面的两次数字,调用两次 共两次copy
vertices.push_backVertex(10,11,12));//拷贝 第四次,拷贝新的数组到容量4里面去,调用两次 共1次copy
题外话:我觉得理解这个蛮重要的!理解怎么运作才可以优化~
#include <string>
#include <iostream>
#include <vector>
//动态数组的优化
struct Vertex
{
float x,y,z;//找变量在内存的位置
Vertex(float x,float y,float z)
:x(x),y(y),z(z)
{
}
Vertex(const Vertex& vertex)
:x(vertex.x),y(vertex.y),z(vertex.z)//每次拷贝一个数组x,y,z
{
std::cout<<"copy"<<std::endl;
}
};
int main()
{
std::vector<Vertex>vertices;//定义一个动态大小的数组 内存连续
std::vector<Vertex>vertices2;
//普通方法
//动态数组分配的大小默认为2的n次方1,2,4,8...
//在main中创建的vertices,push需要放到Vertex中(copy),下一次copy是因为要调整vertices的大小
vertices.push_back(Vertex(1,2,3));//拷贝 第一次,容量为1,拷贝进去,调用一次
vertices.push_back(Vertex(4,5,6));//拷贝 第二次,容量调整为2(包含了新的数组内容),copy一次,再拷贝旧的容量1到 新的容量为2的数组里面,调用一次 共两次copy
vertices.push_back(Vertex(7,8,9));//拷贝 第三次,容量调整为4包含了新的数组内容),copy一次,拷贝旧的容量2里面的两次数字,调用两次 共两次copy
vertices.push_back(Vertex(10,11,12));//拷贝 第四次,拷贝新的数组到容量4里面去,调用两次 共1次copy
std::cout<<"=================="<<std::endl;
//优化
vertices2.reserve(4);//设置固定容量,四次修改,四次copy emplace_back直接传递构造函数的参数列表,直接使用vector的内存 而不是main中copy到vertex
//此时直接使用emplace_back后,直接传递,而不是copy,就不再调用copy了
vertices2.emplace_back(1,2,3);
vertices2.emplace_back(4,5,6);
vertices2.emplace_back(7,8,9);
vertices2.emplace_back(10,11,12);
std::cin.get();
}