"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Passagem por valor ou referência: quando "Quer velocidade? Passagem por valor" é realmente verdade?

Passagem por valor ou referência: quando "Quer velocidade? Passagem por valor" é realmente verdade?

Publicado em 2024-11-08
Navegar:390

  Passing by Value or Reference: When is \

"Quer velocidade? Passar por valor" - Explorando implicações de desempenho

A declaração de Scott Meyers "Quer velocidade? Passar por valor" levanta questões sobre os benefícios de desempenho de passar objetos por valor versus por referência. Neste contexto, passar por valor envolve uma operação de cópia, enquanto passar por referência evita cópias desnecessárias.

Considere o seguinte exemplo com estruturas X e Y:

struct X {
  std::string mem_name;
  X(std::string name) : mem_name(std::move(name)) {}
};
struct Y {
  std::string mem_name;
  Y(const std::string &name) : mem_name(name) {}
};

No construtor do X, o nome do argumento é copiado para um objeto temporário antes de invocar o construtor move em std::string para inicializar mem_name. No construtor de Y, o argumento name é uma referência const, mas uma cópia ainda é feita para inicializar mem_name. Portanto, X executa uma operação de "copiar e mover", enquanto Y executa uma única cópia.

De acordo com o argumento de Meyers, parece que a passagem por valor (como em X) poderia ser mais rápida devido a o potencial para otimizações, como otimização do valor de retorno (RVO). No entanto, um exame mais detalhado revela que o resultado depende do tipo de argumento que está sendo passado (lvalue ou rvalue):

  • Lvalues: Ambos X e Y realizarão uma cópia (em X ao inicializar nome, em Y ao inicializar mem_name), seguido por uma operação de movimentação em X.
  • Rvalues: X só pode realizar uma movimentação se RVO puder ser aplicado, enquanto Y ainda requer uma cópia.

Geralmente, um movimento é mais rápido do que passar um ponteiro, que é essencialmente o que a passagem por referência faz. Portanto, para rvalues, X tem desempenho melhor que Y, enquanto para lvalues, o desempenho é semelhante.

É importante observar que esta não é uma regra universal e as otimizações podem variar dependendo do compilador e da plataforma. A criação de perfil é recomendada para determinar a abordagem ideal em casos específicos.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3