微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在这种情况下std :: move是否过度杀伤力?

如何解决在这种情况下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 举报,一经查实,本站将立刻删除。