【发布时间】:2012-08-16 06:15:23
【问题描述】:
我有以下代码
std::vector<std::string> lines;
std::string currentLine;
while(std::getline(std::cin, currentLine)) {
// // option 1
// lines.push_back(std::move(currentLine));
// // option 2
// lines.push_back(currentLine);
}
我发现两者的成本不同
第一种方法将清除
currentLine,使得getline需要为字符串分配一个新的缓冲区。但它会改为使用向量的缓冲区。第二种方法将使
getline能够重用缓冲区,并且需要为向量内字符串分配新的缓冲区。
在这种情况下,有没有“更好”的方法?编译器可以更有效地优化一种或其他方法吗?或者是否有聪明的字符串实现使一个选项比另一个选项更高效?
【问题讨论】:
-
如果我要选择,我会选择选项二,因为
currentLine(我认为)通常比它需要的大。 (副本不会分享capacity) -
如果有的话,选项 2 允许
currentLine增长,直到它大到足以容纳看到的最大值。如果看到的最大值不是最后看到的值,那么对std::getline的额外调用将不需要重新分配currentLine的缓冲区。 -
如果性能是一个问题,我会使用
move,然后将currentLine调整为与刚刚移动的字符串相同的大小。 -
除非你能真正快速打字,否则我认为这不会有任何不同。 :-) 开玩笑。我也喜欢2。在计算分配数量方面做得很好。
标签: c++ c++11 move-semantics