首先创建字符串,然后通过移动语义将其添加到 vector 或在 vector 中创建元素是否具有内存效率

Is it memory efficient to first create string and then add it to vector through move semantics or to create element in vector?

本文关键字:vector 创建 或在 元素 效率 内存 添加 是否 然后 字符串 语义      更新时间:2023-10-16
std::vector<std::string> v;
v.push_back("");
v[0] += 's';
v[0] += 't';
v[0] += 'r';
v.push_back("");
v[1] += 's';
v[1] += 't';
v[1] += 'r';

std::vector<std::string> v;
std::string s = "";
s += 's';
s += 't';
s += 'r';
std::string s1 = s;
v.push_back(std::move(s));
v.push_back(std::move(s1));

在第一种情况下,我们首先在向量中创建元素,然后对其进行修改。我想在这么小的情况下,首先会保留足够的内存,但如果不是 - 是向量v内存连续的,还是只是指向字符串对象的指针?将元素添加到向量中的字符串元素是否会使最后一个执行内存重新分配?

在第二种情况下,是否为用作 rvalue 的字符串分配的内存将直接添加到分配的某个向量中,而无需为字符串重新分配内存?

std::vector始终将数据存储在连续的内存块中。
在这两种情况下,如果要推回的string都无法容纳
已经分配的内存,将有重新分配。

通过执行v.push_back(std::move(s))数据将被移动到vector
中的std::strings,所以s数据的未使用副本不会保留在内存中。
这对于大量数据可能更有效,但在您的情况下,这
不会有太大区别。

在第二种情况下,您还必须初始化另外两个string...