【发布时间】:2015-01-08 19:59:15
【问题描述】:
如果我有一个现有的非平凡变量,并且我想用我将在赋值的同一行声明的新内容重新分配它,我应该使用移动语义吗?
我的问题来自以下场景:
std::vector<string> existing = { ... };
int main(int argc, char *argv[]){
const char *bunch_of_strings = ... ;
std::stringstream ss(bunch_of_string);
existing = std::move(std::vector<std::string>(std::istream_iterator<std::string>(ss), {}));
}
我应该这样做吗,如果我不这样做,编译器是否会进行类似的优化,还是最好不要这样做?
【问题讨论】:
-
您的分析器向您报告了什么?通常我什至不会考虑上面列出的代码的性能,除非代码被 VTune、Instruments 或 Dtrace 突出显示为性能瓶颈。
-
@AhiyaHiya 我对编译器如何处理它以及它是好还是坏的做法更感兴趣;例如,如果编译器无论如何都会将其转换为移动指令。所以性能不是我主要关心的问题。
-
在这种特定情况下,您应该使用
existing.assign(std::istream_iterator<std::string>(ss), {});,它具有相同的结果,但会重用existing中已经分配的容量。 (见std::vector::assign重载#2) -
@Casey 这在 user2485710 的答案的 cmets 中进行了讨论。这似乎值得商榷,但我绝对同意你的看法。
标签: c++ c++11 move-semantics c++14