所以我有这种情况:
std::vector<Coord3D> thevector;
Run Code Online (Sandbox Code Playgroud)
其中Coord3D只是一个带有3个浮点数的简单结构:x,y和z.构造函数也只是简单地有x = 0; y = 0; z = 0; 等等
现在,假设我想将另一个向量的内容附加到向量中.
是否可以将向量的大小调整为thevector.size()+ theothervector.size(),而无需调用Coord3D()的构造函数?
原因是我想记忆其他向量的内容.在一些基准测试之后,用构造函数初始化内容结果需要一些时间.std :: loop fill也需要相当多的时间.
所以是的,有没有办法在绕过元素的构造函数的同时调整向量的大小?这会涉及狡猾的黑客行为吗?
thevector.insert(thevector.end(), theothervector.begin(), theothervector.end());
Run Code Online (Sandbox Code Playgroud)
如果Coord3D是可按位复制的,编译器应该能够将其优化为与之相同的代码memcpy.
std::vector 都有一个分配器,通常是默认分配器。分配器的construct() 成员函数代表您调用每个元素的构造函数。
为了避免调用每个元素的构造函数,请创建自己的分配器并确保 construct() 成员函数具有空函数体(或一些其他逻辑来在运行时决定是否调用元素的构造函数)。
使用自定义分配器创建向量后,只需 resize() 向量即可。不会有每个元素的构造函数调用。
我已成功使用此技术将 std::vector 指向数据库的持久存储。它避免了每个元素的构造函数(否则会覆盖数据库的存储),并且还避免了数据副本(因为自定义分配器旨在知道要引用数据库存储的哪一部分)。
| 归档时间: |
|
| 查看次数: |
1619 次 |
| 最近记录: |