几十年来,我一直在通过参数列表来制造提供多个值的函数:
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
版本的效率?
答案 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连续内存的副本。