2010-06-22 11 views
5

Mam klasę wektorową 3D. Zmienne prywatne są zdefiniowane:Porównanie pamięci, która jest szybsza?

 
union { 
    struct { 
     double x; 
     double y; 
     double z; 
    }; 
    double data[3]; 
}; 

Realizując operator ==, który jest szybszy?

 
return this->x == v.x && this->y == v.y && this->z == v.z; 

LUB

 
return memcmp(this->data, v.data) == 0; 
+0

Użyłem unii, więc mogę po prostu przekazać 'dane' do API stron trzecich, które wymagają' podwójnego * '. – Anthony

+0

@Stephen - bezpośrednie zapamiętywanie struktury może być ryzykowne. Jeśli kompilator wstawi dopełnienie, struktury mogą się różnić, mimo że wszystkie pola są takie same. –

+0

@R Samuel: Dzięki, dobry punkt. _comment withdrawn._ :) – Stephen

Odpowiedz

15

Niestety oba nie są równoważne. (W szczególności NaN i podpisane zera nie używają porównania bitowego wewnątrz jednostki FPU).

Powinieneś dokonać wyboru w oparciu o poprawność, a nie prędkość.

+1

Po prostu zupełnie o tym zapomniałem. Błąd w zakładzie Rookie, przypuszczam. – Anthony

+1

@Duracell: Błąd debiutanta martwi się o wydajność w porównaniu z dobrym kodem. :) Wydajność to twoja ostatnia sprawa. – GManNickG

+1

@GMan: Można tak powiedzieć, ale zupełnie zapomniałem, że memcmp nie zadziała. Bez tego założyłem, że mój kod jest dobry i dlatego może patrzeć na szybkość. – Anthony

Powiązane problemy