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

时间:2016-02-03 10:32:52

标签: c++ string memory vector move

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));

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

在第二种情况下,将为用作rvalue的字符串分配内存,直接添加到已分配的某处向量中而不对字符串进行内存重新分配?

1 个答案:

答案 0 :(得分:1)

std::vector始终将数据存储在连续的内存块中 在这两种情况下,如果您要推回的string s不适合中 已分配内存,将有重新分配。

通过执行v.push_back(std::move(s)),数据将移至std::string中的vector个 来自s,因此未使用的s数据副本将不会保留在内存中 对于大量数据,这可能更有效,但在您的情况下,这一点 不会有太大的区别。

在第二种情况下,您还需要再初始化两个string s ...