c++ - 对于可移动类型,按值传递比重载函数更好吗?

标签 c++ c++11

<分区>

我想将复制减少到最低限度,尤其是对于昂贵的类型/类。所以我可以这样定义重载:

void SetParams(const std::map<int, std::string> &params) { mParams = parameters; }
void SetParams(std::map<int, std::string> &&params) { mParams = std::move(params); }
void SetBoardInfo(const DataInfoStruct &board_info) { mBoardInfo = board_info; }
void SetBoardInfo(DataInfoStruct &&board_info) { mBoardInfo = std::move(board_info); }

在一个类中有一个名为 mParams 的 std::map 成员变量和一个名为 mBoardInfo 的 DataInfoStruct 结构成员。

由于 DataInfoStruct 没有用户定义的构造函数或析构函数,我假设它有一个隐式移动构造函数。

然后我可以使用左值或右值调用任一重载。但是,我可以像这样只拥有每个函数的一个版本:

void SetParams(std::map<int, std::string> params) { mParams = std::move(params); }
void SetBoardInfo(DataInfoStruct board_info) { mBoardInfo = std::move(board_info); }

在第二种方式中,我将始终创建一个拷贝,因为我按值传递,但随后我将参数移动到成员变量中。如果我传递一个右值,我根本不进行复制,但是对于一个左值,将始终生成一个拷贝 - 如果我使用第一种方法,我将以任何方式进行复制。

推荐这两种方法中的哪一种?右值引用最好只用于构造函数和赋值运算符吗?

最佳答案

第一个版本通常稍微快一些,但它引入了代码重复。第二种方法推荐用于移动成本低的对象。由于大多数对象在 C++ 中的移动成本很低,因此第二种方法通常很好。但是,还有另一种选择:

template<typename T>
void SetParams(T&& params) { mParams = std::forward<T>(params); }

template<typename T>
void SetBoardInfo(T&& board_info) { mBoardInfo = std::forward<T>(board_info); }

感谢universal references ,如果可以使用模板化 setter,这是两全其美的做法。

关于c++ - 对于可移动类型,按值传递比重载函数更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58083598/

相关文章:

c++ - 将数据插入数据结构时是深拷贝还是浅拷贝?

c++ - 为什么 'simplified' 代码没有向量化

c++ - 如何在C++中创建计时器

c++ - 获取模板函数类型

c++ - 在方法中更改类的私有(private)值而不将更改返回给 main()

c++ - 将多个整数分配给二进制字符数组

c++ - C 将 char[] 转换为时间戳;

c++11 - decltype(auto) 与 auto&& 保存 cv 限定符

C++11 复制省略号和异常(catch 参数)

c++ - 使用弃用的绑定(bind)器和 C++0x lambda