哪些set方法在支持右值的编译器中有更好的性能:有或没有const&
?例如
class A
{
public:
void setProperty(Property const& p) {m_property = p;}
void setProperty(Property p) {m_property = p;}
};
或者两者都保留可以吗?这里的 Property
是一个大类。 Visual Assist X 中的重构工具使用第二个没有 const&
的工具。
最佳答案
编写 setter 以获取 const&
:
void setProperty(Property const& p) {m_property = p;}
并且在 C++11 中,编写一个重载也接受 &&
:
void setProperty(Property&& p) {m_property = std::move(p);}
使用“捷径”方法编写一个按值获取属性的重载是很好的:
void setProperty(Property p) {m_property = std::move(p);}
但请注意,当传递一个左值时,这需要在短时间内同时为 3 个对象(原始对象、成员和参数)分配内存。
如果你觉得特别活泼,你可以写一个完美的转发 setter 让你的 friend 和家人惊叹不已:
template <typename T>
void setProperty(T&& t) {m_property = std::forward<T>(t);}
包含 const&
和 &&
两种情况,并且能够接受可分配给 m_property 的任何类型
。请注意,这会降低可读性,并且在误用时会产生“有趣”的错误消息。
关于c++ - 哪些设置方法性能更好 : with or without `const&` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17915170/