Eficiência em C++: passar um objeto por referência-para-const

Sempre que definimos uma função como:

void check(User u);

e a chamamos

User u1;

check(u1);


o objeto User é passado por valor, como também acontece em C.

Assim, o que temos dentro da função check é uma cópia do objeto u1, o que significa que foi preciso chamar o copy-constructor de User para criar u a partir de u1. Além disso, ao terminar a função check, também é preciso chamar o destrutor de User, já que u saiu de escopo.

Há como fazer o mesmo gastando menos?
Se você quer apenas capturar uma informação do usuário u1 (não quer modificá-lo), você pode economizar estas chamadas ao construtor e destrutor de User (que podem ser mais custosas do que parece, por exemplo, se esta classe tiver muitos membros, for derivada de outra classe (neste caso chamaria também o construtor da classe base), entre outros detalhes).

Para tornar seu código mais eficiente, basta passar o objeto User como referência para const.
A assinatura da função fica:

void check(const User& u);

A chamada da função continuaria a mesma:

User u1;

check(u1);

Qual a consequência disto?

Em primeiro lugar, não será chamado construtor algum. É como se estivesse sendo passado um ponteiro para a função check, só que sendo uma referência (em vez de um ponteiro), você não dá à função check o poder de modificar o objeto original, assim como quando se passa por valor - é criada uma cópia dentro da função. A segunda vantagem é que o código da função não muda. A utilização da referência é igual a como se tivesse sido passada por valor, como se u fosse um objeto. Isto é bom, pois o ganho com eficiẽncia não traz complexidade ao código e você pode fazer um upgrade na performance do seu programa alterando apenas a assinatura da função.

Nenhum comentário on "Eficiência em C++: passar um objeto por referência-para-const"

Leave a Reply