如何在不导致复制的情况下将 char 数据附加到 std::vector
How to append char data to a std::vector without causing a copy
我有一个包含一些数据元素的字符向量。
std::vector<unsigned char> data_1;
我有一个 unsigned char * 指向另一组数据元素。
unsigned char * data_2;
问题:
有没有一种方法可以将 data_2
合并到 data_1
这是一个向量,而根本不会导致数据元素的副本?
我读到 this discussion 中提到的移动语义,但我有点不确定在我这里的这种情况下是否可行。
不,你不能那样做。
矢量数据是连续存储的,因此除非您的缓冲区已经 back-to-back 不知何故(实际上不是),否则至少需要移动其中一个(阅读:复制)
向量无法取得现有内存的所有权(您的unsigned char* data_2
)
向量不能同时拥有两个内存块(假设std::vector<unsigned char> data_2
)
但是,您可以在使用时,没关系 having a single iterator type "jump" from the first buffer to the second, transparently。
没有。 vector
是连续存储的;虽然您可以通过在填充 data_1
之前 reserve
足够 space 来避免重新分配 data_1
以获取串联数据的完整大小,但您无法避免实际副本字节;数据必须移动到与 data_1
中现有数据相邻的位置,而 vector
无法避免这种情况。
Is there a way I can merge data_2 into data_1 which is a vector without causing a copy of the data elements at all?
没有。所有将元素插入向量的方法都需要至少复制(或移动)每个元素一次。
I read about move semantics being referred in this discussion but I am a bit unsure if it is possible in this situation I have here.
移动字符与复制字符相同。这种区别仅与具有 non-trivial 移动构造函数或移动赋值运算符的 class 类型相关。
It wouldn't be possible even if data_2 was a std::vector<unsigned char>
?
追加而不复制(或移动)即使那样也是不可能的。
旁注 1:您可以使用向量的移动赋值运算符 用另一个向量的内容替换 一个向量的全部内容,而无需复制(或移动)任何元素。
旁注 2:您 可以 合并两个基于节点的容器实例,例如 std::list
s、std::set
s、std::map
s 和他们的无序副本没有复制(也没有移动)任何元素。
是的,你可以。但是你必须为向量定制分配器。
默认情况下,vector
使用 std::allocator
, and you may use vector::get_allocator
获取分配器对象。您可以尝试使用 allocator::construct
方法进行一些操作(我没有深入研究)。
当您实例化一个 vector
时,您可以将一个 custom-allocator 传递给向量,这将有助于使用已经分配的内存(placement new),或任何其他内存分配函数。 This article 可能会有帮助。
但是,我认为这样的努力并没有真正的成果。
我有一个包含一些数据元素的字符向量。
std::vector<unsigned char> data_1;
我有一个 unsigned char * 指向另一组数据元素。
unsigned char * data_2;
问题:
有没有一种方法可以将 data_2
合并到 data_1
这是一个向量,而根本不会导致数据元素的副本?
我读到 this discussion 中提到的移动语义,但我有点不确定在我这里的这种情况下是否可行。
不,你不能那样做。
矢量数据是连续存储的,因此除非您的缓冲区已经 back-to-back 不知何故(实际上不是),否则至少需要移动其中一个(阅读:复制)
向量无法取得现有内存的所有权(您的
unsigned char* data_2
)向量不能同时拥有两个内存块(假设
std::vector<unsigned char> data_2
)
但是,您可以在使用时,没关系 having a single iterator type "jump" from the first buffer to the second, transparently。
没有。 vector
是连续存储的;虽然您可以通过在填充 data_1
之前 reserve
足够 space 来避免重新分配 data_1
以获取串联数据的完整大小,但您无法避免实际副本字节;数据必须移动到与 data_1
中现有数据相邻的位置,而 vector
无法避免这种情况。
Is there a way I can merge data_2 into data_1 which is a vector without causing a copy of the data elements at all?
没有。所有将元素插入向量的方法都需要至少复制(或移动)每个元素一次。
I read about move semantics being referred in this discussion but I am a bit unsure if it is possible in this situation I have here.
移动字符与复制字符相同。这种区别仅与具有 non-trivial 移动构造函数或移动赋值运算符的 class 类型相关。
It wouldn't be possible even if data_2 was a
std::vector<unsigned char>
?
追加而不复制(或移动)即使那样也是不可能的。
旁注 1:您可以使用向量的移动赋值运算符 用另一个向量的内容替换 一个向量的全部内容,而无需复制(或移动)任何元素。
旁注 2:您 可以 合并两个基于节点的容器实例,例如 std::list
s、std::set
s、std::map
s 和他们的无序副本没有复制(也没有移动)任何元素。
是的,你可以。但是你必须为向量定制分配器。
默认情况下,vector
使用 std::allocator
, and you may use vector::get_allocator
获取分配器对象。您可以尝试使用 allocator::construct
方法进行一些操作(我没有深入研究)。
当您实例化一个 vector
时,您可以将一个 custom-allocator 传递给向量,这将有助于使用已经分配的内存(placement new),或任何其他内存分配函数。 This article 可能会有帮助。
但是,我认为这样的努力并没有真正的成果。