2016-06-13 2 views
1

К примеру, у меня естьПравильное значение массива улучшит производительность?

class A 
{ 
    std::array<Object, 5> m_objects; 

    A(std::array<Object, 5> objects) 
     : m_objects(std::move(objects)) //does using right value will improve 
             // performance in some cases?? 
    {} 
}; 

ли использование правильного значения в конструкторе позволит повысить производительность в некоторых случаях ??

+1

Возьмите универсальную ссылку, если вы не улучшите производительность (в некоторых случаях) – tkausl

+0

Возможный дубликат? http://stackoverflow.com/questions/14370730 –

+0

"правильное значение"? Вы имеете в виду «rvalue» ?! –

ответ

1

Вы должны добавить еще один конструктор, чтобы принять временные массивы.

class A 
{ 
    std::array<Object, 5> m_objects; 

    A(std::array<Object, 5> objects) 
     : m_objects(std::move(objects)) 
    {} 
    A(std::array<Object, 5>&& robj): m_objects(std::move(robj)) 
    {} 
}; 

Вы могли бы также прошли с forwarding referenceT&&, но я оставил, что здесь для ясности. Это более очевидно.

Также обратите внимание, что использование перемещения в этом случае не всегда гарантирует выполнение. Для array движение подразумевает перемещение элементов, удерживаемых array. В этом случае Object экземпляров класса.

Для этого лучше ДОЛЖНО предоставить класс move constructor классу Object, иначе операция перемещения здесь будет только копией отдельных экземпляров Object.

ПРИМЕЧАНИЕ. Конструктор перемещения Object должен быть дешевле, чем конструктор копирования. В противном случае не было бы никакой разницы между перемещением и копированием.

Смежные вопросы