Pergunta

Existe um caso em que a passagem por referência é mais cara que a passagem por valor em C++?Se sim, qual seria esse caso?

Foi útil?

Solução

Prefira passar tipos primitivos (int, char, float, ...) e estruturas POD que sejam baratas para copiar (Point, complex) por valor.

Isto será mais eficiente do que a indireção necessária ao passar por referência.

Ver Características de chamada do Boost.

A classe de modelo call_traits<T> encapsula o "melhor" método para passar um parâmetro de algum tipo T para ou de uma função e consiste em uma coleção de typedefs definidos como na tabela abaixo.O propósito de call_traits é garantir que problemas como "referências a referências" nunca ocorram e que os parâmetros sejam passados ​​da maneira mais eficiente possível.

Outras dicas

Você pode ler este artigo "Quer velocidade? Passe por valor" Sobre a cópia Elision e RVO (retorno por otimização de valor). Isso explica que as referências às vezes impedem o compilador de fazê -las.

Sim, o acesso a um argumento de referência passado pode exigir mais níveis de indireção do que um aprovado pelo argumento do valor. Além disso, pode ser mais lento se o tamanho do argumento for menor que o tamanho de um único ponteiro. Obviamente, tudo está assumindo que o compilador não o está otimizando.

O compilador pode otimizar a passagem de um tipo primitivo por referência para simplesmente passar por valor, se o tipo tiver o mesmo tamanho ou menor que o tamanho de um referência/ponteiro. Não há garantia de que o compilador faça isso, por isso, se você tiver uma escolha, passe tipos primitivos por valor. No código modificado, porém, você geralmente precisa passar por referência de qualquer maneira - considere o push_back do Vector, que exige uma referência const. Se você possui um vetor de INTs, passaria uma referência a um tipo primitivo. Nessa situação, você espera que o compilador otimizasse isso substituindo a referência por um valor. Como o vetor pode estar armazenando grandes tipos, aceitar uma referência const é a melhor escolha.

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