假设我有一个带字符串参数的回调函数。 使用调用站点不再需要的字符串对象调用此回调函数,并且很可能此函数需要执行一些字符串处理。 您建议将什么用于参数 - 左值参考,右值参考或恒定左值参考,还是其他什么?
一个。如果我担心达到最佳性能。
湾如果我担心代码清晰。
CallbackType callback = processMessage; // declared elsewhere
std::string message;
// Way 1: accept by lvalue reference
using CallbackType = std::function<void(std::string&)>;
callback(message);
// Way 2: accept by rvalue reference
using CallbackType = std::function<void(std::string&&)>;
callback(std::move(message));
// Way 3: accept by const lvalue reference
using CallbackType = std::function<void(const std::string&)>;
callback(message);
// Way 4: accept by lvalue
using CallbackType = std::function<void(std::string)>;
callback(message); // copy
callback(std::move(message)); // move
方式1似乎是最快的(函数可以使用原始字符串进行字符串处理,避免任何复制或移动)但看起来有点令人困惑(人们可能想知道他们是否需要更改此参数)。
方式3似乎是使用最广泛的方式,但是最慢,因为函数必须在处理之前复制传递的字符串。
方式2可能在表现中间。
更新:根据答案,添加方式4(来电者可以决定是复制还是移动)。
答案 0 :(得分:3)
您可以按值接受它并让调用者在参数上调用std::move()
。这样被调用者就可以获得自己的副本,调用者可以决定是复制还是移动。
接受r值或非const引用但不会调用移动构造函数。换句话说,如果要最小化执行的指令数,则通过引用接受字符串。