构造字符串向量时是否有任何副本?

Is there any copy when constructing a vector of strings?

本文关键字:任何 副本 是否 字符串 向量      更新时间:2023-10-16

以下代码在vector<string>中拆分"我的字符串":

std::stringstream ss{"my string"};
std::vector<std::string> vec;
std::string tmp;
while (std::getline(ss, tmp, ' ')) {
vec.push_back(tmp);
}

我的理解是,getline将其结果写入tmp然后tmp通过复制它被推送到向量中。但是,这样做会更有效vec.push_back(std::move(tmp))这样我们避免复制吗?

我的理解是getline将其结果写入tmp,然后tmp通过复制它被推送到向量中。

这是正确的。 由于tmp是一个左值,因此必须制作副本。

但是,这样做

会更有效vec.push_back(std::move(tmp))这样我们就可以避免复制吗?

是的。 如果你使用move,而不是复制整个字符串,你只有几个指针/整数交换。 这意味着它可以更快。 在每次迭代中使用getline填充移动自字符串是安全的,因此无需担心(源(。

它不快的唯一方法是字符串具有短字符串优化,并且您放入字符串中的数据是否足够短以符合它的条件。 然后你正在处理一个实际的字符数组,你必须做一个复制,因为数组不能移动。

它更省时,只是稍微提高了内存效率。

无论哪种方式,您都在分配一定数量的字符串。移动临时字符串只会导致循环的最终迭代少分配一次。 但是,移动可以防止在每次迭代时在位置之间复制内存内容的 CPU 和 RAM I/O 开销。