【发布时间】:2018-09-06 10:59:00
【问题描述】:
例如
class A
{
public:
// Option 1
void setI_1(shared_ptr<int> i) { m_i = i; }
// Option 2
void setI_2(shared_ptr<int> i) { m_i = move(i); }
// Option 3
void setI_3(shared_ptr<int> const& i) { m_i = i; }
private:
shared_ptr<int> m_i;
};
通常哪个选项更好?
我在 Visual Studio 2017 上进行基准测试。选项 2 在我测试的所有情况下都为我提供了最佳性能。在某些情况下,选项 3 与选项 2 具有相似的性能,但有些情况更糟。谢谢!
【问题讨论】:
-
对其进行基准测试。如果这取决于编译器,我不会感到惊讶(一些旧的编译器在按值传递和 const 引用方面存在怪癖),但是,对于现代编译器,如果它们都相等,我不会感到惊讶。跨度>
-
选项 3 是最好的。如果需要,您仍然可以检查生成的代码。
-
不出所料,使用 clang,当为“选项 2 和 3”使用左值参考时,我得到了最好的程序集,但是,使用纯右值,选项 2 是最好的。显然,里程可能会有所不同。使用选项 3。
-
@MM:您链接的答案特定于将其传递给函数的情况(没有迹象表明将制作持久副本),并且(至少根据 cmets)正在避免在“存储副本”的情况下处理按值传递,后跟
std::move(此处为选项 2),因为它依赖于发布时并不总是可用的 C++11 功能。鉴于 C++11 在这一点上无处不在,并且这个问题专门将副本存储给成员,而不仅仅是临时使用,我认为您的链接答案不适用。
标签: c++ c++11 shared-ptr