我了解到
std::vector
将在调整大小期间显式调用每个元素的复制构造函数,如果我理解正确的话,这意味着它在幕后不使用 memcpy
或 realloc
,这是我的第一个假设。我的理解正确吗?如果是这样,为什么他们需要以这种方式实现 std::vector
,难道 memcpy
和更好的 realloc
不是在幕后调整动态数组大小的最快选择吗?
memcpy
都会失败,除了那些可轻松复制的值类型。简单可复制意味着:您可以 memcpy
类型的实例。
任何(内部)管理资源的东西都不能轻易复制。例如,您不能
memcpy
a std::string
(您可以尝试,但最终会得到损坏的实例)。更正式地(取自此处):
普通可复制类是这样的类:没有非平凡的复制构造函数,没有非平凡的移动构造函数,没有非平凡的复制赋值运算符,没有非平凡的移动赋值运算符,并且有平凡的析构函数。
换句话说,对于普通可复制类型,通过
memcpy
复制它或通过调用其复制构造函数实际上没有区别。如果我没记错的话,std::vector
的实现可以利用它并有条件地使用memcpy
。如果我没有再弄错的话,你不会注意到显着的差异,因此我不期望实现能够做到这一点。