2012-01-04 14 views
16

Gdybym miał zadeklarować zmienną wewnątrz pętli, czy szybciej jest mieć deklarację poza pętlą? Czy program ponownie przydziela pamięć dla n w każdej iteracji lub używa w całym tym samym miejscu pamięci?Zmienne zadeklarowane w pętli

for(int i=0;i<10;i++) 
{ 
    int n = getNumber(); 
    printf("%d\n",n); 
} 

kontra

int n; 
for(int i=0;i<10;i++) 
{ 
    n = getNumber(); 
    printf("%d\n",n); 
} 

Odpowiedz

12

zmienne nie są naprawdę "stworzył" lub "zniszczony". Są to pojęcia na poziomie abstrakcji języka programowania. Kompilator nie musi mieć odwzorowania jeden do jednego między zmienną a adresami pamięci. W praktyce przez większość czasu przestrzeń stosu dla zmiennych lokalnych jest przydzielana od razu na początku funkcji, więc nie ma wpływu na wydajność.

Należy zauważyć, że C++, w przeciwieństwie do C, który nie ma pojęcia dla konstruktorów, obsługuje konstruowanie i niszczenie obiektów, więc jeśli zdefiniowałbyś zmienną typu klasy w pętli for, tak jak poniżej,

class MyClass { 
    public: MyClass() { cout << "hello world" << endl; } 
}; 
//... 
for (int i = 0; i < 10; ++i) { 
    MyClass m; 
} 

nazwałbyś go swoim konstruktorem za każdym razem, skutecznie drukując "cześć świat" dziesięć razy. Jest to bardzo odmienne od deklaracji C i nie należy go mylić z nim.

+0

Dzięki, chodzi mi o to, że pamięć jest ponownie przydzielana przy każdej iteracji. Zmieniłem pytanie. –

14

Każdy nowoczesny kompilator zoptymalizuje je do tego samego kodu maszynowego, więc nie powinno być żadnej różnicy.

+2

Definiowanie w pętli jest bardziej przejrzyste i może generować bardziej zoptymalizowany kod, ponieważ kompilator zna czas życia (chociaż prawdopodobnie nie dla prostego typu) –

1

Dla współczesnych kompilatorów to nie ma znaczenia. Przypisują rejestry procesorów lub umieszczają zmienne na stosie tak wydajnie, jak to tylko możliwe.

Powiązane problemy