Производительность движения конструктора объекта с членом кортежа
Вопрос
У меня есть вопрос о производительности конструктора перемещения, класса Pseudo C ++:
typedef tuple<std::string, std::vector<double>, ...and more...> FooTupleMember;
class Foo1
{
public:
Foo1::Foo1 (Foo1&& object) :
member (std::move (object.member))
{
// ...
}
private:
FooTupleMember member;
};
class Foo2
{
public:
Foo2::Foo1 (Foo2&& object) :
member (std::move (object.member))
{
// ...
}
private:
std::unique_ptr<FooTupleMember> member;
};
Когда я перемещаю объект Foo1. Класс Он инициализирует шаги конструкторов всех объектов, хранящихся в кортеже, верно? Это означает, что операция движения может быть довольно дорогой.
Но я перемещаю объект Foo2 Операция класса всего класса намного быстрее, потому что я передаю только внутренний указатель данных, хранящихся в Smart Picketer, верно?
Ссылка на r value быстрее, чем почтение L-значения, потому что требуют гораздо меньше операций копий, это очевидно. Однако возвращение объекта из функции с использованием конструктора перемещения еще дороже, чем хранить один и тот же объект в Smart Pointer и возвращать Smart Pointer.
Перемещение объектов через L-значение очень медленное, перемещение его с помощью Smart Pointer очень быстрое, и перемещение через R-значение находится где-то посередине.
Я не вижу «силы» R-значения, потому что она не так эффективна, как говорят многие люди. Используя Smart Picketer вместо R-значения IMHO лучше (я имею в виду быстрее), и это код элегантный и понятный. Я прав?
Решение
Если в вашем классе есть много участников, то вам придется переместить их все (или достаточно, чтобы шаг имел смысл в любом случае). Это всегда будет дороже, чем перемещение одного (умного) указателя, но, вероятно, дешевле, чем копирование.
Тем не менее, хранение ваших данных в куче, чтобы вы могли получить к ним доступ через указатель (для быстрого движения) повлияет на производительность остальной части вашего кода, поскольку каждый доступ должен определить указатель.
Профиль и оптимизируйте медленные биты. Если перемещение не является узким местом, тогда сделайте то, что делает оставшуюся часть вашего кода быстрее, и наоборот.