Pergunta

Eu defini a seguinte classe:

class Action
{
    public: 
    Action(){ _bAllDone = false; }

    void AddMove( Move & m );
    private:
        std::deque<Move> _todo;
        bool _bAllDone;
};

O membro AddMove é definido da seguinte forma:

void Action::AddMove( Move & m )
{ 
    _todo.push_back( m ); 
}

Observei que, sem o argumento de referência a essa função, o construtor de cópias foi chamado duas vezes, onde com um argumento de referência foi chamado apenas uma vez. Chamar um construtor de cópia é apenas uma vez em vez de duas vezes um bom motivo para usar um argumento de referência?

Foi útil?

Solução

A classe Deque no STL deve manter uma cópia do elemento que você passa para o método push_back. É daí que vem um construtor de cópia.

Se você se livrar da referência em addMove (), primeiro obterá uma cópia do parâmetro (e, portanto, uma invocação do construtor de cópias) e, quando você pressionar, receberá uma segunda cópia.

A dupla invocação do construtor de cópias é um desperdício, portanto a referência é preferível. No entanto, você deve declarar o parâmetro de addmove () como uma referência const, para indicar ao chamador que o elemento não será modificado. Sob tal garantia (supondo que você não o quebre), é seguro passar no objeto por referência sem se preocupar e sem pagar a penalidade de uma cópia do objeto.

Outras dicas

Parece uma grande vantagem para mim. As coisas podem ficar muito lentas se você estiver executando muitos acrescentarem iterativamente. A quantidade real de trabalho dependeria da definição de movimento e de seu construtor de cópias. E pequenas mudanças podem ter efeitos graves no desempenho. Morda de qualquer maneira, a passagem por cópia ainda seria o dobro do trabalho.

O efeito geral disso dependerá de quanto de todo o processamento gasta nesta operação. Faça uma vez, você nunca notará; Faça alguns milhares de vezes, e pode ser significativo. No entanto, como um princípio geral, evite copiar dados onde você possa fazer referência a eles com segurança, especialmente porque neste caso não há nenhuma clareza ou complexidade particular - é tão fácil torná -lo rápido quanto para fazer isso devagar, então por que você fazer isso devagar?

Isto devo Seja uma referência, caso contrário, você estará incorrendo em uma cópia desnecessária (e potencialmente incorreta) do argumento. Também deve ser const, caso contrário, você restringirá desnecessariamente seus chamadores.

Observe também que os nomes com um sublinhado líder são reservados para a implementação do idioma; portanto, seu programa é realmente "indefinido".

Hth

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top