Pergunta

Suponha que eu tenho o seguinte código:

class some_class{};

some_class some_function()
{
    return some_class();
}

Isso parece funcionar muito bem e me poupa o trabalho de ter de declarar uma variável apenas para fazer um valor de retorno. Mas eu não acho que eu já vi isso em qualquer espécie de tutorial ou referência. Isto é uma coisa específica de compilador (C Visual ++)? Ou isso é alguma coisa errada a fazer?

Foi útil?

Solução

Sem isso é perfeitamente válido. Isso também será mais eficiente como o compilador é realmente capaz de otimizar afastado o temporário.

Outras dicas

Retornando objetos a partir de uma chamada de função é a "fábrica" ??Design Pattern, e é amplamente utilizado.

No entanto, você vai querer ter cuidado se você retornar objetos, ou ponteiros para objetos. O primeiro destes irá apresentá-lo para copiar construtores operadores / atribuição, o que pode ser uma dor.

É válido, mas o desempenho pode não ser ideal, dependendo de como ele é chamado.

Por exemplo:

A a;
a = fn();

e

A a = fn();

não são os mesmos.

No primeiro caso, o construtor padrão é chamado, e então o operador de atribuição é invocado em um que requer uma variável temporária para ser construído.

No segundo caso, é utilizado o construtor de cópia.

Um compilador suficientemente inteligente vai descobrir o que otimizações são possíveis. Mas, se o construtor de cópia é fornecido pelo usuário, então eu não vejo como o compilador pode otimizar a variável temporária. Tem que chamar o construtor de cópia, e para isso ele tem que ter outra instância.

A diferença entre o exemplo de Rob Walker é chamado Valor de retorno Optimization (RVO), se você quiser google para ele.

A propósito, se você quiser enure seu objeto é retornado da maneira mais eficiente, criar o objeto na pilha (ou seja, através de novo) usando um shared_ptr e retornar um shared_ptr em vez. O ponteiro é retornado e contagens de referência corretamente.

Isto é perfeitamente razoável C ++.

Isto é perfeitamente legal C ++ e qualquer compilador deve aceitá-lo. O que faz você pensar que poderia estar fazendo algo errado?

Essa é a melhor maneira de fazê-lo se sua classe é muito leve -. Quero dizer que não é muito caro para fazer uma cópia do mesmo

Um efeito colateral desse método é que embora ele tende a torná-lo mais provável que tenha objetos temporários criados, apesar de que pode depender de quão bem o compilador pode otimizar as coisas.

Para as classes mais pesados ??que você quer ter a certeza não são copiadas (digamos, por exemplo uma imagem bitmap grande), então é uma boa idéia para passar esse tipo de coisa em torno de como um parâmetro de referência que então é preenchido, apenas para fazer absolutamente certo de que não haverá quaisquer objetos temporários criados.

Em geral, pode acontecer que a simplificação sintaxe e fazendo as coisas ficaram mais diretamente pode ter um efeito colateral de criar objetos mais temporários em expressões, apenas algo que você deve ter em mente ao projetar as interfaces para objetos mais pesados.

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