【发布时间】:2019-06-12 19:30:20
【问题描述】:
我遇到了std::vector<T> 的一个问题,其中T 是一个内置类型,表示该向量不可轻易复制。
我想知道这是否正确,正在寻找原因。
【问题讨论】:
-
您可以随时联系
std::is_trivially_copyable
标签: c++ c++11 language-lawyer c++-standard-library
我遇到了std::vector<T> 的一个问题,其中T 是一个内置类型,表示该向量不可轻易复制。
我想知道这是否正确,正在寻找原因。
【问题讨论】:
std::is_trivially_copyable
标签: c++ c++11 language-lawyer c++-standard-library
形式上,std::vector<T>(对于任何T)不是trivially copyable,因为它的复制构造函数不是trivial,如果仅仅是因为它是用户提供的(而不是隐式定义的)。
实际上,复制向量不仅仅是对其数据成员进行浅拷贝 - 它需要在堆上分配内存缓冲区并从另一个向量的堆分配缓冲区复制其内容。
【讨论】:
vector 随着数据的添加而增长。这意味着不需要预先知道存储所有数据需要多少空间。 vector 通过在堆上分配(和重新分配)一个单独的存储缓冲区来解决这个问题。该缓冲区在内部进行管理,同时提供了一个可以作为可变大小数组的接口。
现在,如果一个对象是可简单构造的,则应该能够简单地使用memcpy(dest, &a, sizeof(a)) 复制/克隆该对象。如果要为vector 执行此操作,则将有 2 个向量对象指向同一个存储缓冲区。这将导致可怕的未定义行为。因此,复制向量需要复制内部存储,复制其参数,然后将内部指针设置为指向正确的存储缓冲区。这需要对象的内部知识。
std::array 但是,在编译时设置了静态大小。它没有内部指针,因此可以简单地使用memcpy 进行复制。因此,复制是微不足道的。
【讨论】: