在此功能中使用参考参数有任何优势吗?
-
19-09-2019 - |
题
我已经定义了以下类:
class Action
{
public:
Action(){ _bAllDone = false; }
void AddMove( Move & m );
private:
std::deque<Move> _todo;
bool _bAllDone;
};
成员AddMove定义如下:
void Action::AddMove( Move & m )
{
_todo.push_back( m );
}
我指出,如果没有对此函数的参考参数,复制构造函数被称为两次,其中使用参考参数仅被称为一次。是否仅调用复制构造函数一次,而不是两次使用参考参数的充分理由?
解决方案
STL中的Deque类应该将您传递给其push_back方法的元素的副本维护。那就是一个复制构造函数的来源。
如果您摆脱了AddMove()中的参考,则首先将获得参数的副本(因此是复制构造函数的一个调用),然后当您向后推时,您将获得第二份副本。
复制构造函数的双重调用是浪费的,因此优选参考。但是,您应该将AddMove()的参数声明为const引用,以向呼叫者表示不会修改元素。在这样的保证下(假设您不违反),可以通过参考来通过对象安全,而无需担心,而无需支付对象副本的罚款。
其他提示
对我来说似乎是一个很大的优势。如果您执行许多迭代性,情况可能会变得非常慢。实际工作量取决于移动的定义及其复制构造函数。小变化可能会对性能产生严重影响。无论哪种方式,经过副本的工作仍然是工作的两倍。
这一点的总体效果将取决于整个处理在此操作上花费了多少。做一次,您永远不会注意到;做几千次,这可能很重要。但是,作为一般原则,避免复制可以安全地引用它的数据,尤其是因为在这种情况下没有特别的清晰度或复杂性问题 - 使其快速速度和使其缓慢的速度一样容易,所以为什么您会这样让它慢?
它 必须 成为参考,否则您将产生该参数的不必要(可能是不正确的)副本。也应该是 const
, ,否则,您将不必要地限制您的呼叫者。
还请注意,带有领先的下划线的名称保留给语言实现,因此您的程序实际上是“未定义”。
Hth
不隶属于 StackOverflow