【发布时间】:2020-10-23 11:18:45
【问题描述】:
我想编写一个模板函数,通过移动或复制接收参数。 我使用的最有效的方法是:
void setA(A a)
{
m_a = std::move(a);
}
这里,当我们使用is时
A a;
setA(a); // <<---- one copy ctor & one move ctor
setA(std::move(a)); // <<---- two move ctors
我最近发现用这种方式定义它,有两个功能:
void setA(A&& a)
{
m_a = std::move(a);
}
void setA(const A& a)
{
m_a = a; // of course we can so "m_a = std::move(a);" too, since it will do nothing
}
会节省很多!
A a;
setA(a); // <<---- one copy ctor
setA(std::move(a)); // <<---- one move ctor
这太棒了!对于一个参数...创建具有 10 个参数的函数的最佳方法是什么?!
void setAAndBAndCAndDAndEAndF...()
有人有什么想法吗? 谢谢!
【问题讨论】:
-
也可以考虑
void setA(A a) { std::swap(m_a, a); }。 -
最有效的方法是在构造函数中使用完美转发。
-
@WhozCraig:为什么?用
m_a的先前内容填充a有什么好处,而不是让它“空”,当函数退出时它就会被销毁? -
如果你有一个简单的 setter 函数来设置任何值,你也许可以有一个公共数据成员。然后你可以只写
obj.a = std::move(a);或obj.a = a;只需1 个副本或移动。此外,如果您使 setter 内联或对整个程序进行优化,并且您的移动构造函数没有副作用(它不应该),则可以优化第二步。 -
“最有效的”是没有一个函数首先需要 10 个参数。它在其他地方也会受到伤害,而不仅仅是参数的副本。只是说...
标签: c++ performance c++11 c++17