SORU
31 EKİM 2011, PAZARTESİ


Döngüler, iyi uygulama kötü uygulama içinde ilan değişkenler? (2 ye bölünmüş)

Soru #1:Bir döngü iyi bir uygulama ya da kötü uygulama içinde bir değişken bildirmek?

Ya da bir performans sorunu (en) " yok olsun, ve her zaman değişkenleri bildirmek gerekir olarak kapatmak için kullanılabilir nereye ile ilgili diğer konuları okudum. Benim asıl merak ettiğim aslında tercih edilen ya da bu kaçınılmalıdır olup olmadığını ya da değildir.

Örnek:

for(int counter = 0; counter <= 10; counter  )
{
   string someString = "testing";

   cout << testing;
}

Soru #2:Çoğu derleyici değişkeni zaten bildirilmiş farkında ve sadece o kısmı atla, ya da aslında bellekte bir yer her zaman oluşturmak mı?

CEVAP
31 EKİM 2011, PAZARTESİ


Bumükemmeluygulama.

Döngü içinde değişken oluşturarak, kendi kapsamı içinde döngü sınırlı olduğundan emin olun. Başvurulan ne de döngünün dışında çağrılamaz.

Bu şekilde

  • Eğer adı değişkendir biraz "Genel" ("i"), herhangi bir risk için karışımı ile başka bir değişken adı bir yerden sonra senin kod (da hafifletilmiş kullanarak -Wshadow uyarı öğretim GCC)

  • Derleyici değişken kapsamı içinde döngü ile sınırlıdır ve bu nedenle değişken yanlışlıkla başka bir yerde çağrılırsa doğru hata iletisi sorunu olduğunu bilir

  • Son ama en az değil, bazı özel optimizasyon değişken olamaz döngünün dışında kullanılamaz olduğunu bildiği için daha verimli derleyici (en önemlisi kayıt tahsisi) tarafından gerçekleştirilebilir. Örneğin, daha sonra yeniden kullanmak için sonucu depolamak gerekiyor.

Kısacası, haklısın.

Değişken olduğunu unutmayınsözde değerini korumak için değilher döngü arasında. Böyle bir durumda, her zaman başlatmak gerekebilir. Ayrıca daha büyük bir blok, başka bir döngü değerleri korumak gerekir hangi değişkenleri bildirmek için döngü, kapsayıcı oluşturabilirsiniz. Bu genellikle döngü sayacı kendisi içerir.

{
    int i, retainValue;
    for (i=0; i<N; i  )
    {
       int tmpValue;
       /* tmpValue is uninitialized */
       /* retainValue still has its previous value from previous loop */

       /* Do some stuff here */
    }
    /* Here, retainValue is still valid; tmpValue no longer */
}

Soru #2: Değişken işlevi çağrıldığında, bir kez tahsis edilir. Ayırma bir bakış açısıyla aslında (neredeyse) işlevi başında bir değişken bildirmek aynıdır. Kapsam tek fark: değişken olamaz döngünün dışında kullanılabilir.

İle sınırlı ve daha hassas kapsam gel daha doğru optimizasyon, yani sonunda olabilir Olası değişken olsa dahi tahsis etme veya yeniden kullanarak kullanılmayan bir yuva (aslında çok nadiren bu). Ama hiçbir zaman işlevini başında ayrılırken daha yavaş olacaktır.

Tahsisi hakkında yorum yanıt olarak: Yukarıdaki kural C doğrudur, ama bazı C sınıfı için olmayabilir.

Standart tipleri ve yapıları için, değişken boyutu derleme zamanında biliniyor. "" Değişken boşluk sadece içine ayrılacak yani C, işlevi çağrıldığında yığın (herhangi bir başlatma olmadan) yazın. inşaat diye bir şey yok Bu yüzden orada bir "" bir döngü içinde. değişken bildirirken maliyeti sıfırdır

Ancak, C sınıfları için çok daha az biliyorum bu yapıcı bir şey yok. Ayırma muhtemelen derleyici aynı alanı yeniden kullanmak için yeterince akıllı olmalıdır beri sorun olacak, değil sanırım, ama başlatma her döngü tekrarında de yer alması muhtemeldir.

5* *açık kaynak aracı (C/C kodu için statik analiz aracı) mükemmel ipuçları değişkenlerin optimal kapsamı konusunda sağlar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GoogleTechTalks

    GoogleTechTa

    15 AĞUSTOS 2007
  • justintimberlakeVEVO

    justintimber

    2 EYLÜL 2009
  • lissaandbeauty

    lissaandbeau

    24 Aralık 2011