2012-07-06 27 views
11

Varyant:Yineleyici ve const_iterator arasındaki karşılaştırmalar verimsiz mi? Bir

const auto end = whatever.end(); 
for (auto it = whatever.begin(); it != end; ++it) 
{ 
    // ... 
} 

Varyant b: loop koşulu Yineleyicilerin iki farklı türde karşılaştırır beri

const auto end = whatever.cend(); // note the call to cend insteand of end here 
for (auto it = whatever.begin(); it != end; ++it) 
{ 
    // ... 
} 

o varyantı b varyantı a göre daha az verimli olacağına inanıyoruz için herhangi bir neden var mı? Bu, it üzerinde örtük bir dönüşüme neden olur mu?

( end dolayısıyla döngü içine üzerinden kaldırma benim arzu birden çok kez kullanılır.)

+0

Hangi kapsayıcı için? –

+0

@David Benim özel durumumda, bir 'std :: string', ama genel olarak merak ediyorum. – fredoverflow

cevap

12

Prensip olarak, daha az verimli olduğu ve sıfır olmayan maliyeti ile örtülü bir dönüşümle sonuçlanır.

Uygulamada, iterator ve const_iterator eşitsizlik operatörü temel sınıf olacak şekilde tanımlanır (ya da bir başka türeyen, ya da her ikisi, bir _iterator_base türeyen) bir miras ilişkisiyle vermeye büyük ihtimalle katılan ve gerek için orada örtük bir dönüşüm (bunun yerine daha türetilmiş yineleyici dikkate alınmaz). Bunların yokluğunda bile, dönüşümün satır içi ve en iyi duruma getirilebilecek kadar küçük olması muhtemeldir. ++ herhangi optimizasyonu yok libc http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a02037.html#l00295

:

libstdC++ iterator ve const_iterator arasında operator== ve operator!= tanımlayarak, farklı bu karşılaştırmaları optimize http://llvm.org/svn/llvm-project/libcxx/trunk/include/__tree - yine iterator den const_iterator yapıcısı ben istiyorum o kadar önemsiz olmasına rağmen Tamamen optimize edilmesini bekliyoruz.

İlgili konular