Производительность движения конструктора объекта с членом кортежа

StackOverflow https://stackoverflow.com/questions/4113496

  •  29-09-2019
  •  | 
  •  

Вопрос

У меня есть вопрос о производительности конструктора перемещения, класса 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 лучше (я имею в виду быстрее), и это код элегантный и понятный. Я прав?

Это было полезно?

Решение

Если в вашем классе есть много участников, то вам придется переместить их все (или достаточно, чтобы шаг имел смысл в любом случае). Это всегда будет дороже, чем перемещение одного (умного) указателя, но, вероятно, дешевле, чем копирование.

Тем не менее, хранение ваших данных в куче, чтобы вы могли получить к ним доступ через указатель (для быстрого движения) повлияет на производительность остальной части вашего кода, поскольку каждый доступ должен определить указатель.

Профиль и оптимизируйте медленные биты. Если перемещение не является узким местом, тогда сделайте то, что делает оставшуюся часть вашего кода быстрее, и наоборот.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top