2010-11-18 19 views
0

Fast and flexible iterator for abstract class soruyla ilgili yardım ile soyut bir GridData sınıfı için soyut bir GridIterator oluşturdum. Şimdi GridIterator'ın herhangi bir somut alt sınıfını GridData'nın herhangi bir alt sınıfında yinelemek için kullanabiliyorum. Ancak, test sırasında sanal operatör ++ ve sanal operatör * operatörlerinin algoritmaların gerçek darboğazları haline geldiğini öğrendim. Hızlandırmak için yapabileceğim bir şey olup olmadığını merak ediyorum. Soyutlama nedeniyle, inlining muhtemelen benim için çalışmayacak mı?Nesne yönelimli yineleyici sınıfım nasıl hızlandırılır?

Ayrıca bir const yineleyici sağlamak istiyorum. Bu çalışmayı mevcut sınıf tasarımıyla nasıl yapacağımı bilmiyorum. Orijinal sorumu (Fast and flexible iterator for abstract class) referans alarak, sadece bir ConstGridIterator alt sınıf olarak T yerine const T ile bir STL forward iterator oluşturabilir miyim? Ya da her bir yineleyici sınıfının bir const sürümünü (GridIterator ve baseImpl) uygulamak zorunda mıyım?

cevap

3

STL olarak yapın ve bir yineleyici veya kapsayıcıda sanal yöntemler kullanmayın. Çoğu derleyici, optimize edilmek istendiğinde, çoğu STL yineleyiciyi tamamen atladıkları noktaya kadar optimize edebilir ve nesne dosyasında bile bulunmazlar. Örneğin; vector<T>::iterator, kurucular, yıkıcılar ve karmaşık operatör yeniden tanımlamaları ile karmaşık bir sınıf olsa bile *(vector<T>.begin()+5), vector<T>.__underlying_array[5] için optimize edilebilir. her yerde operator++, begin(), end() veya operator !=() çağrı yığını içinde sanal bir yöntem çağrısı olması

yöntem şey tarafından yeniden tanımlanabilir çünkü doğru bu duruma getirmek için derleyici engeller. Sanal yöntemlerin yalnızca küçük bir çalışma zamanı yükü yok, daha modüler hale getirerek kodu daha fazla kabul edilmez hale getiriyorlar.

Performans istiyorsanız, miras yerine şablonları kullanmayı düşünün veya derleyicinizi bu sınıfı devralmadığını söyleyerek düzeltin. Bu, mevcut tasarımınızla çakışabilir, ancak bu üç özellik arasında iki öncelik seçmeniz gerekir: performans, modülerlik ve maliyet.

İlgili konular