C++ 我应该将临时变量移到变量中吗?

C++ 我应该将临时变量移到变量中吗?,c++,c++11,move-semantics,c++14,C++,C++11,Move Semantics,C++14,如果我有一个现有的非平凡变量,并且我想用我将在赋值的同一行声明的新内容重新赋值,我应该使用移动语义吗 我的问题来自以下场景: std::vector<string> existing = { ... }; int main(int argc, char *argv[]){ const char *bunch_of_strings = ... ; std::stringstream ss(bunch_of_string); existing = std::m

如果我有一个现有的非平凡变量,并且我想用我将在赋值的同一行声明的新内容重新赋值,我应该使用移动语义吗

我的问题来自以下场景:

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), {}));
}
std::vector existing={…};
int main(int argc,char*argv[]){
常量字符*字符串串=;
std::stringstream ss(串串串);
existing=std::move(std::vector(std::istream_迭代器(ss),{}));
}

我应该这样做吗?如果我不这样做,编译器会对其进行类似的优化吗?还是最好不要这样做?

std::move
在那里是多余的。
move
的目的是在变量不是(或可能不是)时将其视为临时变量(更准确地说,是右值)。如果它已经是一个右值,它肯定会被移动,如果可能的话。

我认为为该向量构建该对象最合适的方法是使用
emplace\u back
也就是说,你只需在原地创建该对象,不复制,不移动,你只要把事情做好就行了,如果它本来就应该是这样的


您的档案员向您报告了什么?通常,我甚至不考虑上面列出的代码的性能,除非代码被VTune、To仪或DTrack突出显示为性能瓶颈。AHIYAHIGI我更感兴趣的是编译器如何对待它,以及它是好的还是坏的实践;如中所示,如果编译器仍将其转换为移动指令。所以性能不是我主要关心的问题,它具有相同的结果,但重用已在
现有中分配的容量。(见overload#2)@Casey这一点在user2485710回答的评论中进行了讨论。这似乎是有争议的,但我绝对同意你的看法。这是我通常使用的
move
(当然),但我不确定编译器是如何处理这些情况的。阅读了有关复制省略的内容后,我有了一个好主意。@CoffeeandCode复制省略适用于将临时对象移动到其他新初始化的对象中的情况。它在这里不适用,因为向量正在被赋值,而不是初始化。无论如何,编译器总是根据表达式的形式知道什么时候是右值。这一举措已经得到了保证,仅仅是基于“构造函数调用”语法的使用,句号。是的,我知道。信不信由你,我现在正试图编写一个编译器:L,但别担心,我;在我读了大量的理论知识并使我的解析器/词法分析器达到最新水平之前,我不会去翻译成汇编或优化,哈哈。但是我的
向量
不能保证是空的。现在我们讨论的是性能,您认为所有元素的
clear()
然后
emplace\u back()
的成本会有多高?而且,我还认为
assign()
是最合适的方法。@CoffeeandCode
emplace\u back
在最后一个元素(如果有)之后构造对象;向量是否为空并不重要。我还认为在C++11及更高版本中清除数组的最有效方法是使用空数组进行交换,您有
std::vector vec
vec清除
vec
。swap(std::vector{})
@CoffeeandCode
assign
一点也不灵活,仔细看,它可能只在元素序列反复重复时才有用,老实说,我看不出
assign
有什么实际用途。在这种情况下,但它所能做的就是复制。
stringstream
的底层结构不能保证适合移动到
vector
中,因此必须将每个元素复制到其中。对于
vector::assign()
,这似乎是一个很好的例子。