Функция C ++, предоставляющая несколько значений: ссылочные параметры или кортеж? - PullRequest
0 голосов
/ 24 мая 2019

В течение десятилетий я создавал функции, предоставляющие несколько значений, с помощью списка параметров:

void initialize (World& world, Monster& monster, Player& player)
{
   world.load("worldFile.txt");
   monster.load ("monsterFile.txt"); monster.setPos (100,0,0);
   player.setPos (0,0,0);
}

C ++ 17, конечно, предоставляет кортежи, но это выглядит неэффективно:

std::tuple<World, Monster, Player> initialize ()
{
   World world; Monster monster; Player player; //do loading etc.;
   return {world, monster, player};
}

Но это должно быть хорошо (я думаю):

std::tuple<double, std::string> makeSomething ()
{
    return {5.0, "someString"s};
}

В какой момент затраты на копирование становятся настолько высокими, что разумнее использовать опорные параметры, чем кортеж? или есть способ сделать auto initialize версию эффективной?

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Существует хорошее обсуждение параметров и возвращаемых значений в основных рекомендациях .

F.20: Для выходных значений «out», предпочитайте возвращаемые значения выходным параметрам

Единственная причина использования ссылок - большие объекты.В соответствии с рекомендациями, «большой» означает пользовательские выделения или копии более 1 КБ непрерывной памяти.

2 голосов
/ 24 мая 2019

Вам необходимо переместить объекты, чтобы избежать копирования:

std::tuple<World, Monster, Player> initialize ()
{
    // ...
    return {std::move(world), std::move(monster), std::move(player)};
}

Типы должны быть подвижными.Если это не так, вы все равно получаете копии.

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