如何解决在这种情况下std :: move是否过度杀伤力?
我想知道在此示例中使用server.post('/directline/token',async function(req,res) {
const result = await fetch('https://directline.botframework.com/v3/directline/tokens/generate',{
method: 'POST',headers: {
Authorization: 'Bearer ' + process.env.DirectLinesecret
}
});
const token = await result.json();
res.send(token);
});
是不是简单复制还是在计算上更昂贵?我真的很想知道。
std::move()
解决方法
阅读core guidelines at F.call: Parameter passing,我们可以得出一些建议。
仅在要优化右值时才使用move。如果您发现它可以改善性能,则完全取决于您。
您可以按值接收,然后移动它,因为它将优化rvalues调用优化到setter中,但是却悲观了lvalues。这是因为std::string
将重用其存储,并且在从const引用进行复制时不会引起不必要的分配。在没有SSO的情况下,复制到value参数总是最终分配。
尤其是对于setter来说,首选方法是使用const引用,并在将rvalues传递给setter时添加rvalue引用重载:
class Student
{
private:
std::string _studentName;
int _studentGrade;
public:
Student() : _studentName("No Name"),_studentGrade(0) {}
std::string_view Name() const { return _studentName; }
void Name(std::string const& x) { _studentName = x; }
// add this when you need to optimize for rvalues.
// optimizing for rvalues is not always needed.
// They can speedup quite a bit when actually needed.
void Name(std::string&& x) { _studentName = std::move(x); }
// int is a trivial type,so move does nothing. No move needed.
int Grade() const { return _studentGrade; }
void Grade(int x) { _studentGrade = x; }
}
对于int,std::move
不会做任何事情,它仍然是副本。只需按值获取它们,然后按值返回即可。
但是,您能做的最好的事情要简单得多:
class Student
{
public:
std::string studentName;
int studentGrade;
};
由于您的设置者不强制执行任何不变式,因此最好使用公共成员。您不需要重载和引用,因为std::string
为您实现了它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。