c++ - 哪些设置方法性能更好 : with or without `const&` ?

标签 c++ accessor

哪些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/

相关文章:

c++ - 在 OpenGL : My gun is being clipped agains the frustum 中构建 FPS

c++ - 调试时如何查看全局变量

python - 无需 try/catch 即可安全访问 Python 中的对象

c++ - Xcode 无法识别 "class"这个词

c++ - c++中使用迭代器修改数组元素

c++ - 智能感知 : no operator "<<" matches these operands

c# - 只允许在构造函数中设置值的设置访问器的名称是什么?

c# - 在 UML 类图中表示 C# 访问器属性?

c++ - 初学者 C++ 使用访问器/ getter 从私有(private)成员变量(二维数组)中提取数据

c# - 在 C# 中替换/更改空白或空字符串值