2012-01-04 5 views
16

Döngü içinde bir değişken bildirmek istersek, bildirimin döngü dışında olması daha mı hızlı olur? Program, her yinelemede n için belleği yeniden tahsis ediyor mu, yoksa aynı bellek konumunu kullanıyor mu?Bir döngü içinde bildirilen değişkenler

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

cevap

12

Değişkenler karşı

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

gerçekten "oluşturulmuş" veya "yok" değildir. Programlama dilinin soyutlama düzeyinde kavramlardır. Derleyicinin bir değişken ve bellek adresleri arasında bire bir eşleştirmeye sahip olması gerekmez. Pratikte, çoğu zaman, yerel değişkenler için yığın alanı, işlevin başında bir defada tahsis edilir, bu yüzden performansta bir fark yaratmayacaktır.

Kurucular için bir fikri olmayan C'den farklı olarak C++, nesne yapısını ve yıkımını desteklediğini unutmayın, bu nedenle aşağıdaki gibi bir for döngüsünde bir sınıf türünde bir değişken tanımlamanız gerekiyordu,

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

Yapımcıyı her seferinde, her seferinde "merhaba dünya" yı on kez basmak için çağırırsınız. Bu C bildirimlerinden çok farklıdır ve bununla karıştırılmamalıdır.

+0

Teşekkürler, her yinelemede yeniden ayrılan bellek kastediyorum. Soruyu değiştirdim. –

14

Herhangi bir modern derleyici, bunları aynı makine koduna göre optimize eder, dolayısıyla hiçbir fark görmemelisiniz.

+2

Döngünün tanımlanması daha nettir ve derleyici kullanım ömrünü bildiği için daha iyi bir kod üretebilir (büyük ihtimalle basit bir tür olmasa bile) –

1

Çoğu modern derleyiciler için bu önemli değil. İşlemci kayıtlarını atayacaklar veya değişkenleri yığına mümkün olduğunca verimli bir şekilde yerleştirecekler.