作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近读到(不幸的是忘了在哪里),写 operator= 的最佳方式是这样的:
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
而不是这个:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
想法是,如果使用右值调用 operator=,则第一个版本可以优化拷贝的构造。因此,当使用右值调用时,第一个版本更快,而当使用左值调用时,这两个版本是等效的。
我很好奇其他人对此有何看法?人们会因为缺乏明确性而避免使用第一个版本吗?我是否正确认为第一个版本可以更好而且永远不会更糟?
最佳答案
您可能从以下位置阅读它:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
我没有太多要说的,因为我认为链接很好地解释了基本原理。有趣的是,我可以确认第一种形式导致我使用 MSVC 构建的拷贝更少,这是有道理的,因为编译器可能无法对第二种形式进行复制省略。我同意第一种形式是一种严格的改进,绝不会比第二种形式差。
编辑:第一种形式可能不那么惯用,但我认为它并不那么清晰。 (IMO,这并不比第一次看到赋值运算符的 copy-and-swap 实现更令人惊讶。)
编辑 #2:糟糕,我是想写复制省略,而不是 RVO。
关于c++ - 按值显式复制构造函数或隐式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2034635/
我是一名优秀的程序员,十分优秀!