调整c ++向量的大小而不调用它们的构造函数

kam*_*iro 1 c++ vector

所以我有这种情况:

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也需要相当多的时间.

所以是的,有没有办法在绕过元素的构造函数的同时调整向量的大小?这会涉及狡猾的黑客行为吗?

ybu*_*ill 8

thevector.insert(thevector.end(), theothervector.begin(), theothervector.end());
Run Code Online (Sandbox Code Playgroud)

如果Coord3D是可按位复制的,编译器应该能够将其优化为与之相同的代码memcpy.


Pau*_*rtz 5

std::vector 都有一个分配器,通常是默认分配器。分配器的construct() 成员函数代表您调用每个元素的构造函数。

为了避免调用每个元素的构造函数,请创建自己的分配器并确保 construct() 成员函数具有空函数体(或一些其他逻辑来在运行时决定是否调用元素的构造函数)。

使用自定义分配器创建向量后,只需 resize() 向量即可。不会有每个元素的构造函数调用。

我已成功使用此技术将 std::vector 指向数据库的持久存储。它避免了每个元素的构造函数(否则会覆盖数据库的存储),并且还避免了数据副本(因为自定义分配器旨在知道要引用数据库存储的哪一部分)。