c++ - 提供多个值的 C++ 函数:引用参数还是元组?
问题描述
几十年来,我一直在通过参数列表制作提供多个值的函数:
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
版本高效?
解决方案
您需要移动对象以避免复制:
std::tuple<World, Monster, Player> initialize ()
{
// ...
return {std::move(world), std::move(monster), std::move(player)};
}
类型必须是可移动的。如果不是,您仍然可以获得副本。
推荐阅读
- javascript - 如何判断是否在我的页面上显示较少的 GPU 密集型图形?
- php - php生成一个下拉年份为-5年和+5年的选择框
- c# - C#,控制台应用程序的重定向进程的 WaitForInputIdle() 是否有同样的事情?
- java - 如何在 Single 方法中为不同的端点创建对象,而不是 java 中的 if 循环
- dart - 重定向的构造函数具有不兼容的参数
- c - 为什么读取用户输入时c中的scanf会跳过字符值?
- maven - 如何通过 pom.xml 将参数传递给 testng.xml 从 jenkins 运行单个测试用例
- c# - 查找列表和数据库表之间的重复项
- c# - 尝试激活时无法解析类型“Microsoft.AspNetCore.Mvc.IUrlHelper”的服务
- angular - 无法摆脱额外的搜索栏以及登录和注册按钮