Meu instrutor me disse uma vez que eu não deveria definir uma variável dentro de um loop , mas sinceramente ainda não entendo o porquê.
Quais são as desvantagens disso?
Alguém poderia me explicar isso?
c++
programming-practices
performance
initialization
declarations
user3260672
fonte
fonte
const
menos que haja uma razão para não (um hábito da programação funcional). Ou não vou modificá-los, e o otimizador deve detectar quando não são necessários, ou eu irei e evitei um bug sério. Quando esses valores intermediários constantes são específicos para uma iteração do loop, isso significa declará-los dentro do loop. Outro momento em que você precisa declarar variáveis fora do loop, porém, é quando você se refere a elas fora do loop; por exemplo, os resultados que você está armazenando.Respostas:
Não é um problema definir uma variável dentro de um loop. De fato, é uma boa prática, pois os identificadores devem ser confinados ao menor escopo possível.
O que é ruim é atribuir uma variável a um loop se você puder atribuí-lo uma vez antes de o loop ser executado. Dependendo da complexidade do lado direito da tarefa, isso pode se tornar bastante caro e até dominar o tempo de execução do loop. Se você escreve um loop que usa o mesmo valor calculado em todas as iterações, definitivamente deve computá-lo acima do loop - isso é mais importante do que minimizar seu escopo.
Para esclarecer: desde que
compute()
sempre retorne o mesmo valor, issoé mais inteligente que isso:
fonte
1/1/1900
, a variável deve ser declarada e o valor deve ser atribuído antes do loop.Tipos complexos têm construtores e destruidores não triviais.
Esses serão chamados no início e no final do corpo do loop (como é inicializado e sai do escopo). Se a inicialização for cara, como ela precisa alocar memória, isso deve ser evitado.
No entanto, para tipos triviais, isso não é problema. A própria alocação e desalocação está apenas adicionando e subtraindo um valor do ponteiro da pilha. (que será otimizado)
fonte
Bem, o conselho dele é um pouco simples demais (isso é um eufemismo).
A sequência abrange desde uma boa ideia sobre quem se importa e uma má ideia até impossível .
Você deve segui-lo sempre que a reutilização for mais barata do que destruir o antigo e criar um novo.
Você deve evitá-lo por uma questão de estilo quando não importa para o desempenho.
Você realmente deve evitá-lo quando tiver um desempenho pior ou a semântica errada.
Você não pode segui-lo quando o tipo usado não permite troca, nem atribuição de movimento nem atribuição de cópia.
fonte
for (std::string s; std::cin >> s;) ...
e ainda ser "fora"