2009-08-12 15 views
8

Yineleyici koşulu sağ işleneni size_t'dan int'a dönüştürmek veya int maksimum değerini geçmeden potansiyel olarak yinelemek daha iyi midir? Cevap uygulaması özel mi? Bunu yapmak için iyi bir neden yok çünküSize_t'den int'ye veya size_t ile yineleme yapın.

int a; 
for (size_t i = 0; i < vect.size(); i++) 
{ 
    if (some_func((int)i)) 
    { 
     a = (int)i; 
    } 
} 

int a; 
for (int i = 0; i < (int)vect.size(); i++) 
{ 
    if (some_func(i)) 
    { 
     a = i; 
    } 
} 
+1

Anladığım kadarıyla, her yerde sorunuzu yazarken size_t diyorsunuz. Eğer öyleyse, lütfen düzenleyin. –

+2

'static_cast' kullanın. – GManNickG

+4

"size_t" ve "int", 32 bitlik bir sistemde bile aynı türde değil. 'im' imzalanırken size_t işareti imzasız. Bu önemli bir öğe olabilir. –

cevap

7

Zamanın yaklaşık% 80, ben some_func muhtemelen de alması gerektiğini keşfetmek bulmak çünkü hemen hemen her zaman, ilk varyasyonunu kullanın size_t. Gerçekte some_func imzalı bir int alırsa, vect INT_MAX'dan büyük olduğunda ne olacağını bilmeniz gerekir. Çözümü sizin durumunuzda açık değilse (genellikle değil), en azından some_func((int)i)'u some_func(numeric_cast<int>(i)) ile değiştirebilirsiniz (numeric_cast'in bir uygulaması için Boost.org'a bakın). Bu, vect, negatif değerlere sessizce sarılmak yerine, planladığınızdan daha büyük büyüdüğünde bir istisna atma zekasına sahiptir.

+0

Bu durumda bir istisna fikrini beğeniyorum, çünkü gerçekten garip davranışları ortadan kaldırıyor ... O zaman, muhtemelen hiç bir zaman "INT_MAX" ı geçmeyecek diye büyük bir güçlük çekiyor. –

+0

@Nick: Neden eklemek ve farklı bir cast (ve uygun bir, FTM - C tarzı dökümler asla uygun değildir) kullanmak çok fazla güçlük olduğunu düşünüyorsunuz. – sbi

+0

Bir işlev "istediğiniz şeyi yapmalı" olmalıdır. "Belgelenmemiş bazı sınırlara kadar ne istediğinizi yapar ve sonra başka bir şey yapar" işlevi, genellikle "kara mayını" olarak adlandırılır. Evdeki kara mayınları terk etmek, ev ödevi probleminden başka bir şey için her zaman kötü bir fikirdir. –

3

Sadece bir size_t gibi bırakmak istiyorum. Ne demek "ile potansiyel olarak maksimum tip_t değerine kadar yükselir"? Sadece vect.size() değerine dönüşüyorsun.

1

Çoğu derleyici için herhangi bir fark yaratmayacaktır. 32 bit sistemlerde, açık, ama 64 bit sistemlerde bile, her iki değişken de muhtemelen 64 bitlik bir kayıtta saklanacak ve yığına 64 bitlik bir değer olarak aktarılacaktır.

Derleyici int değerlerini yığında 32 bit değer olarak depolarsa, ilk işlev CPU döngüleri açısından daha verimli olmalıdır.

Ama fark önemsiz (ikinci işlevi her ne kadar temizleyici "bakar")

+0

Teşekkürler, evet daha az döküm olduğu için 2. temizleyiciyi daha iyi görünüyor sanıyordum. Kabul? –