Выполнение конструктора перемещения объекта с членом кортежа - PullRequest
0 голосов
/ 06 ноября 2010

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

Ссылка на R-значение быстрее, чем ссылка на l-значение, потому что требуется гораздо меньше операций копирования, это очевидно.Однако вернуть объект из функции с помощью конструктора перемещения все же дороже, чем хранить тот же объект в интеллектуальном указателе и вернуть интеллектуальный указатель.

Перемещение объектов через l-значение происходит очень медленно, перемещение через интеллектуальный указатель очень быстро иперемещение его через r-значение где-то посередине.

Я не вижу «силы» r-значения, потому что это не так эффективно, как говорят многие люди.ИМХО лучше использовать умный указатель вместо r-значения (я имею в виду быстрее), и это код элегантный и понятный.Я прав?

1 Ответ

1 голос
/ 09 ноября 2010

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

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

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

...