std :: vector是可微复制的,为什么?

时间:2019-01-18 14:02:04

标签: c++ c++11 language-lawyer c++-standard-library

我遇到了std::vector<T>的一个问题,其中T是一种内置类型,表示向量不可轻易复制。

我想知道这是否正确,并且正在寻找原因。

2 个答案:

答案 0 :(得分:5)

形式上,AbstractItemNormalizer(对于任何std::vector<T>)不是trivially copyable,因为它的副本构造函数不是trivial,即使仅仅是因为它是用户提供的(相对于隐式定义)。

实际上,复制向量不只是对其数据成员进行浅表复制,还需要在堆上分配一个内存缓冲区,并从另一个向量的堆分配缓冲区中复制其内容。

答案 1 :(得分:1)

vector随着数据的添加而增长。这意味着无需预先知道需要多少空间来存储所有数据。 vector通过在堆上分配(和重新分配)单独的存储缓冲区来解决此问题。该缓冲区在内部进行管理,同时提供了一个可以作为可变大小数组的接口。

现在,如果一个对象是微不足道的可构造对象,则只需使用memcpy(dest, &a, sizeof(a))就可以复制/克隆该对象。如果要对vector执行此操作,则将有2个指向相同存储缓冲区的向量对象。这将导致可怕的不确定行为。因此,复制向量需要复制一个内部存储器,复制其参数,然后将内部指针设置为指向正确的存储缓冲区。这需要对象的内部知识。

std::array但是在编译时设置了静态大小。它没有内部指针,因此可以简单地使用memcpy复制。因此,复制非常简单。