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

时间:2020-10-28 15:13:08

标签: c++ c++11

我想知道在此示例中使用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()

1 个答案:

答案 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为您实现了它。

相关问题