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