为什么 std::vector 在调整大小时不使用 memcpy 或 realloc

问题描述 投票:0回答:1

我了解到

std::vector
将在调整大小期间显式调用每个元素的复制构造函数,如果我理解正确的话,这意味着它在幕后不使用
memcpy
realloc
,这是我的第一个假设。我的理解正确吗?如果是这样,为什么他们需要以这种方式实现
std::vector
,难道
memcpy
和更好的
realloc
不是在幕后调整动态数组大小的最快选择吗?

c++ std stdvector
1个回答
1
投票
对于大多数值类型来说,

memcpy
都会失败,除了那些可轻松复制的值类型。简单可复制意味着:您可以
memcpy
类型的实例。

任何(内部)管理资源的东西都不能轻易复制。例如,您不能

memcpy
a
std::string
(您可以尝试,但最终会得到损坏的实例)。更正式地(取自此处):

普通可复制类是这样的类:没有非平凡的复制构造函数,没有非平凡的移动构造函数,没有非平凡的复制赋值运算符,没有非平凡的移动赋值运算符,并且有平凡的析构函数。

换句话说,对于普通可复制类型,通过

memcpy
复制它或通过调用其复制构造函数实际上没有区别。如果我没记错的话,
std::vector
的实现可以利用它并有条件地使用
memcpy
。如果我没有再弄错的话,你不会注意到显着的差异,因此我不期望实现能够做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.