Какой самый быстрый способ поменять местами две сложные структуры? - PullRequest
0 голосов
/ 26 февраля 2019

Мне нужно поменять значение одной структуры с другой и считаю, что своп будет быстрее, чем копирование - я прав?

#include <iostream>
#include <algorithm>
#include <vector>

class B
{
 public:
  int y;
  std::vector<int> z;
  B(){std::cout << "Called" << std::endl;}
 private:
 int z1;
};

int main()
{
 B b1, b2;
 b1.z.push_back(1);
 std::swap(b1,b2);
 std::cout << b2.z[0] << std::endl;
 b1.z.push_back(1);
 b2 = std::move(b1);
 std::cout << b2.z[0] << std::endl;
 b1.z.push_back(1);
 std::exchange(b1, b2);
 std::cout << b2.z[0] << std::endl;
 b1.z.push_back(1);
 b2 = std::forward<B>(b1);
 std::cout << b2.z[0] << std::endl;
}

Приведенный выше код выполняет свопы, как и ожидалось, но я не уверенчто является самым быстрым способом.Моя цель - скопировать значения (поменять местами, если это быстрее) одной структурной переменной на другую.В реальном коде структура будет иметь сложные определяемые пользователем типы.

Я понимаю, что аналогичным образом будут способы копирования, но какой способ является лучшим / безопасным / быстрым для копирования в место назначения?

Нужно ли мне позаботиться о каком-нибудь операторе / конструкторе, чтобы помочь ему?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я понимаю, что аналогичным образом будут способы копирования, но какой способ является лучшим / безопасным / быстрым для копирования в место назначения?

std::swap на самом деле не будет копировать так долгокак твой тип подвижен.В простейшем виде это выглядит как

template<typename T>
void swap(T& lhs, T& rhs)
{
    T tmp{std::move(rhs)};
    rhs = std::move(lhs);
    lhs = std::move(tmp);
}

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

0 голосов
/ 26 февраля 2019

Дано

  1. Компилятору разрешено сгенерировать конструктор перемещения для B (исследование правило 5 ), котороеявляется конструкцией перемещения внутри элемента, подчиняющейся правилу as-if

  2. std::move, если доступен конструктор перемещения

  3. std::swap использует std::move

  4. std::vector имеет конструктор перемещения

, используя просто

std::swap(b1, b2);

будет очень трудно победить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...