R S*_*hko 6 c++ parameters optimization operators conversion-operator
我最近阅读(并且遗憾地忘记了在哪里),编写operator =的最佳方法是这样的:
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是,如果使用rvalue调用operator =,则第一个版本可以优化复制的构造.因此,当使用rvalue调用时,第一个版本更快,当使用左值调用时,这两个版本是等效的.
我很好奇其他人对此的看法?由于缺乏明确性,人们会避免使用第一个版本吗?我是否正确,第一个版本可以更好,永远不会更糟?
您可能从以下位置阅读:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
我没什么可说的,因为我认为该链接很好地解释了原理。有趣的是,我可以确认第一种形式会导致我使用 MSVC 构建的副本较少,这是有道理的,因为编译器可能无法对第二种形式进行复制消除。我同意第一种形式是严格的改进,并且绝不会比第二种更差。
编辑:第一种形式可能不太惯用,但我认为它并不太不清楚。(IMO,这并不比第一次看到赋值运算符的复制和交换实现更令人惊讶。)
编辑 #2:哎呀,我的意思是写复制省略,而不是 RVO。