2

假设我有以下两个类:

class Person
{
    public:
        Person(string name, string surname)
            : _name(move(name)), _surname(move(surname)) { }
        ...
    private:
        string _name;
        string _surname;
};

class Student : public Person
{
    public:
        Student(string name, string surname, Schedule schedule)
            : Person(move(name), move(surname)), _schedule(move(schedule)) { }
        ...
    private:
        Schedule _schedule;
};

int main()
{
    Student s("Test", "Subject", Schedule(...));
    ...
    return 0;
}

这是移动语义的一个很好的用法吗?如您所见,Student 构造函数中有一层“move-s”。是否可以在不使用引用将参数转发到基本构造函数的情况下避免move函数调用开销?const

或者也许......每当我需要将参数转发给基本构造函数时,我应该使用 const 引用吗?

4

2 回答 2

4

不会。只有非常大的类型才能获得性能提升,这种情况非常少见。绝对,当处理一些你事先不知道的移动非常昂贵或不可移动的类型时,然后假设便宜的移动。

您现有的代码是惯用的 C++11,在这方面一个完美的转发构造函数是错误的,并且会因为一个参数启动而严重破坏事情。

于 2013-03-16T13:30:42.327 回答
2

在选择优化. 您很可能不需要在一次复制/移动操作上保存,在这种情况下,您应该倾向于清晰和简单(例如参考const)。

这就是说,如果您担心转发构造函数参数的开销,您可以使构造函数成为构造函数模板并使用完美转发来产生最小开销,无论您传递的是右值还是左值:

class Person
{
    public:
        template<typename T, typename U>
        Person(T&& name, U&& surname)
            : _name(std::forward<T>(name)), _surname(std::forward<U>(surname)) { }
        ...
    private:
        string _name;
        string _surname;
};

class Student : public Person
{
    public:
        template<typename T, typename U, typename V>
        Student(T&& name, U&& surname, V&& schedule)
            : Person(
                std::forward<T>(name), 
                std::forward<U>(surname)), 
                _schedule(std::forward<V>(schedule)) 
        { }
        ...
    private:
        Schedule _schedule;
};
于 2013-03-16T12:44:29.890 回答