2013-08-17 29 views
20

STL, 2 değeri değiştirmek için genel std::swap işlevini uygular. Şu şekilde sunulabilir:Tamsayı türleri için std :: takas ne kadar hızlı?

void swap_u(size_t& x, size_t& y) 
{ 
    x = x^y; 
    y = x^y; 
    x = x^y; 
} 

Sorularım:

  1. Ancak
    template <class T> void swap (T& a, T& b) 
    { 
        T c(std::move(a)); 
        a=std::move(b); 
        b=std::move(c); 
    } 
    

    , 2 tamsayılar takas bir XOR takas algoritması (http://en.wikipedia.org/wiki/XOR_swap_algorithm) bulunmaktadır Bugünlerde bir optimizasyon mu (x86 veya arm)?

  2. C++ standardı bu tür bir optimizasyonu destekliyor mu?
  3. Tam sayılar için uzmanlık alanına sahip olan gerçek bir STL uygulaması var mı?
+19

XOR takas, verimli bir optimizasyon değil - daha kullanışlı bir optimizasyondan daha fazla bir yeniliktir - sadece geçici bir değişken kullanın, basit tutun ve hilelerden kaçının - derleyicinin zeki şeyleri yapmasına izin verin. –

+5

İkinci uygulama, x ve y aynı bellek adresine işaret ediyorsa (değişken indekslere sahip dizi öğelerini geçiriyorsanız gerçekleşebilir) çalışmaz. – sudeepdino008

+1

Geçici bir kayıt kullanarak swapping daha hızlı olmalıdır. Ve derleyicinin ilk durumda yapması gereken budur. – lapk

cevap

32

Durumların çoğunda, XOR takası bir optimizasyon değildir. Bu wiki entry numaralı telefona bakın. En pratik senaryolarda, geçici bir yazmaç kullanan önemsiz takas algoritması daha verimlidir. XOR takas pratik olabilir ki burada sınırlı durumlar şunlardır:

komut seti kodlama bayt daha az sayıda kodlanacak XOR takas izin veren bir işlemci üzerinde
  • ;
  • Yüksek kayıt basıncına sahip bir bölgede, kayıt ayırıcının bir döküntüyü dökmemesine izin verebilir.
  • Kullanılabilir RAM'in çok sınırlı olduğu mikro denetleyicilerde.

Bu durumlar nadir olduğundan, en iyi duruma getirilen derleyiciler XOR takas kodu oluşturmaz. Ayrıca, XOR takası uygulamanızın bozuk olduğunu unutmayın. İlk önce x ve y'nin takma ad olmadığını kontrol etmelisiniz. Bu kontrol kesinlikle XOR takasını yavaşlatacaktır.

XOR takasını kullanan standart kitaplık uygulamalarının farkında değilim.

Standart kitaplığın ne işe yaradığına bakılmaksızın, XOR takasının normal takastan gerçekten daha hızlı olmasının ardından, derleyicileri optimize etmenin bir XOR takasına dönüştürmek için bir peephole optimization yapması gerektiğini unutmayın. Bu gerçekten sadece derleyicinin sizin için seçmesine izin veren bir durumdur.

+4

Ve bir kontrol sadece peephole optimizasyonu ile ilgili daha da yavaşlatmak için –

+7

+1 yapacaktır. – lapk

+1

Burada iyi bir ders öğrendik: ** Freaky-tricky-wiki kodu bir optimizasyon olamazdı ** – Manu343726

6

XOR takası gerçekten sadece bir hile ve bazı durumlarda başarısız olabilir (örneğin, her iki değişken aynı nesneye başvurulardır).

XOR takas ayrıca, seri bağımlılıkları olduğu için özellikle verimli değildir, bu nedenle her zaman en az üç yönerge döngüsü gerçekleştirecektir. Geçici bir takasın kullanılması, daha az bağımlılığa sahip olmakla birlikte, modern süper-işlemci CPU'larında bazı paralelliklere izin verir - bazı CPU'larda, bir komutta bile uygulanabilir, ancak özel talimatlar olmadan bile, iki döngüde iyi bir şekilde yürütülebilmektedir.

4

X86'da, bellek konumları arasında (CPU yazmaçları değil) üçlü bir XOR değişimi, aynı işlemci döngülerini üç kopya olarak alır. Geçici bir kayıt olsaydı bile daha az olabilirler.