我遇到了std::vector<T>
的一个问题,其中T
是一种内置类型,表示向量不可轻易复制。
我想知道这是否正确,并且正在寻找原因。
答案 0 :(得分:5)
形式上,AbstractItemNormalizer
(对于任何std::vector<T>
)不是trivially copyable,因为它的副本构造函数不是trivial,即使仅仅是因为它是用户提供的(相对于隐式定义)。
实际上,复制向量不只是对其数据成员进行浅表复制,还需要在堆上分配一个内存缓冲区,并从另一个向量的堆分配缓冲区中复制其内容。
答案 1 :(得分:1)
vector
随着数据的添加而增长。这意味着无需预先知道需要多少空间来存储所有数据。 vector
通过在堆上分配(和重新分配)单独的存储缓冲区来解决此问题。该缓冲区在内部进行管理,同时提供了一个可以作为可变大小数组的接口。
现在,如果一个对象是微不足道的可构造对象,则只需使用memcpy(dest, &a, sizeof(a))
就可以复制/克隆该对象。如果要对vector
执行此操作,则将有2个指向相同存储缓冲区的向量对象。这将导致可怕的不确定行为。因此,复制向量需要复制一个内部存储器,复制其参数,然后将内部指针设置为指向正确的存储缓冲区。这需要对象的内部知识。
std::array
但是在编译时设置了静态大小。它没有内部指针,因此可以简单地使用memcpy
复制。因此,复制非常简单。