提供多个值的C ++函数:参考参数还是元组?

时间:2019-05-24 14:21:22

标签: c++ c++17

几十年来,我一直在通过参数列表来制造提供多个值的函数:

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 个答案:

答案 0 :(得分:2)

您需要移动对象以避免复制:

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

类型必须是可移动的。如果没有,您仍然会得到副本。

答案 1 :(得分:2)

core guidelines中对参数和返回值进行了很好的讨论。

  

F.20:对于“输出”输出值,更喜欢返回值而不是输出参数

使用引用的唯一原因是大对象。根据指导原则,“大”表示自定义分配或更多1KB连续内存的副本。