Mój instruktor powiedział mi kiedyś, że nie powinienem definiować zmiennej wewnątrz pętli , ale szczerze mówiąc nadal nie rozumiem, dlaczego.
Jakie są wady tego?
Czy ktokolwiek mógłby mi to wyjaśnić?
c++
programming-practices
performance
initialization
declarations
użytkownik3260672
źródło
źródło
const
chyba że istnieje ku temu powód (nawyk programowania funkcjonalnego). Albo ich nie zmodyfikuję, a optymalizator powinien wykryć, kiedy nie są potrzebne, albo zrobię to i zapobiegłem poważnemu błędowi. Gdy te stałe wartości pośrednie są specyficzne dla iteracji pętli, oznacza to deklarowanie ich wewnątrz pętli. Innym razem, gdy musisz zadeklarować zmienne poza pętlą, jest to, że będziesz odwoływał się do nich poza pętlą; na przykład przechowywane wyniki.Odpowiedzi:
Zdefiniowanie zmiennej w pętli nie stanowi problemu . W rzeczywistości jest to dobra praktyka, ponieważ identyfikatory powinny być ograniczone do możliwie najmniejszego zakresu.
Złe jest przypisanie zmiennej w pętli, jeśli równie dobrze można ją przypisać raz przed uruchomieniem pętli. W zależności od tego, jak skomplikowana jest prawostronna strona zadania, może to być dość kosztowne, a nawet zdominować czas wykonywania pętli. Jeśli napiszesz pętlę, która używa tej samej wartości obliczeniowej we wszystkich iteracjach, zdecydowanie powinieneś obliczyć ją powyżej pętli - jest to ważniejsze niż minimalizowanie jej zakresu.
Aby wyjaśnić: tak długo, jak
compute()
zawsze zwraca tę samą wartość, tojest mądrzejszy niż to:
źródło
1/1/1900
, zmienna powinna zostać zadeklarowana, a wartość powinna być przypisana przed pętlą.Typy złożone mają nietrywialne konstruktory i destruktory.
Będą one wywoływane na początku i na końcu korpusu pętli (ponieważ jest on inicjowany i wychodzi poza zakres). Jeśli inicjalizacja jest kosztowna, ponieważ wymaga przydzielenia pamięci, należy tego uniknąć.
Jednak w przypadku trywialnych typów nie stanowi to problemu. Sama alokacja i dezalokacja polega jedynie na dodawaniu i odejmowaniu wartości od wskaźnika stosu. (które zostaną zoptymalizowane)
źródło
Cóż, jego rada jest nieco zbyt prosta (to mało powiedziane).
Następujące zakresy to aż z dobrym pomysłem na kogo to obchodzi i zły pomysł do niemożliwe .
Powinieneś postępować zgodnie z nim, ilekroć ponowne użycie jest tańsze niż niszczenie starego i tworzenie nowego.
Powinieneś unikać go ze względu na styl, gdy nie ma to znaczenia dla wydajności.
Ty naprawdę powinny unikać go, kiedy ma gorszą wydajność lub niewłaściwych semantykę.
Nie można tego zrobić, gdy użyty typ nie pozwala ani na zamianę, ani na przeniesienie, ani na kopiowanie.
źródło
for (std::string s; std::cin >> s;) ...
i nadal być „na zewnątrz”