std :: tuple и переместить семантику - PullRequest
0 голосов
/ 03 июля 2018

Интересно о двух вещах.
1. Стоит ли реализовывать перемещение std::tuple? Например, за std::tuple<int, int, int> мы что-нибудь получим? Будет ли это быстрее, чем копирование или передача по ссылке?
2. В приведенном ниже примере, есть ли реальная разница между этими двумя?

void print_tuple(const std::tuple<int&&, int&&, int&&> position)
{
    int x = std::get<0>(position);
    int y = std::get<1>(position);
    int z = std::get<2>(position);

    std::cout << "x: " << x << " y: " << y << " z: " << z << std::endl;
}

void print_tuple(const std::tuple<int, int, int>&& position)
{
    int x = std::get<0>(position);
    int y = std::get<1>(position);
    int z = std::get<2>(position);

    std::cout << "x: " << x << " y: " << y << " z: " << z << std::endl;
}

int main()
{
    print_tuple(std::forward_as_tuple(1, 2, 3));
    print_tuple(std::move(std::tuple<int, int, int>(4, 5, 6)));
    //...
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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

Компилятор может оптимизировать перемещение для примитивных типов, таких как целые числа, хотя я не знаком с деталями низкого уровня.

Вы можете посмотреть на реализацию следующего, если хотите поддерживать свои собственные типы классов:

class MyClass
{
    MyClass(MyClass&& m);
    MyClass& operator =(MyClass&& m);
};
0 голосов
/ 03 июля 2018
  1. Очевидно, что перемещение std::tuple может дать огромное ускорение. Представьте себе копирование std::make_tuple(std::vector<int>(1000000, 0)¸ std::string(23456, 'H')). Для std::tuple<int, int, int> перемещение не будет отличаться от копирования. Таким образом,

  2. Для кортежа, такого же простого, как и для трех целых, вы можете передать его через constref; или вообще по значению, особенно если фактический аргумент является временным.

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