我已经定义了以下类:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top