2012-09-06 14 views
7

Mam trzy pytania dotyczące zamiany, najprawdopodobniej dość podstawowe dla ciebie.Pytania dotyczące wydajności zamiany

(1) w odniesieniu do dwóch takich samych pojemników typu STL a i b, obie operacje poniżej będzie działać

swap(a,b); 
a.swap(b); 

Rozumiem, że drugi specjalizuje się w pojemniku (np polega tylko kilka iterator swaps), podczas gdy pierwszy jest globalnym algorytmem przeznaczonym do pracy z typowymi typami danych i wykonuje wewnętrzną kopię-konstrukt.

Moje pytanie brzmi: jeśli napiszę pierwszy, czy kompilator użyje drugiego bez względu na to, czy muszę uważać, aby sprawdzić, czy istnieje odpowiednia specjalizacja?

(2) Czy swap(a,b) dałby taki sam efekt z swap(b,a)? Jeśli konstrukt kopii jest zaangażowany, a obiekty mają znacznie różny rozmiar, podejrzewam, że może to mieć znaczenie?

(3) W przypadkach, gdy przeciążony operator == istnieje i jest relatywnie szybki, sprawdzenie przed a == b ma sens w celu uniknięcia niepotrzebnych operacji. Czy std::swap stosuje tę kontrolę w pierwszej kolejności, czy też wykonuje operację niezależnie?

Dziękujemy za poświęcony czas!

Odpowiedz

7
  1. Światowy swap szablon specjalizuje się dla każdego z typów standardowych bibliotek obsługiwanych swap; specjalizacja nazywa członka swap.

  2. Nie powinno być różnicy między swap(a, b) i swap(b, a). (Mogę sobie wyobrazić perwersyjne typy, w których byłoby to ważne, ale to nigdy nie zdarzyłoby się w praktyce).

  3. Nie, std::swap zwykle nie sprawdza pod kątem równości. W wielu przypadkach byłoby to wolniejsze niż po prostu zamiana.

+0

Czy to nie wszystko zależy od konkretnej implementacji STL? Nie sądzę, abyś mógł czerpać to ze standardu. –

+1

Numer 3 może być zależny od implementacji. 1 jest jednoznacznie wymagane. –

+0

Dziękuję bardzo za szybką odpowiedź. – Chrys

Powiązane problemy