我想知道在此示例中使用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()
答案 0 :(得分:1)
阅读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
为您实现了它。