2010-06-22 16 views
5

Ho una classe vettoriale 3D. Le variabili private sono definite:Confronto di memoria, che è più veloce?

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

Nell'implementazione dell'operatore ==, che è più veloce?

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

O

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

Ho usato l'unione in modo da poter passare 'dati' a API di terze parti che richiedono un' double * '. – Anthony

+0

@Stephen: la memorizzazione diretta di una struttura può essere rischiosa. Se il compilatore inserisce padding, le strutture possono essere diverse anche se tutti i campi sono uguali. –

+0

@R Samuel: Grazie, buon punto. _comment withdrawn._ :) – Stephen

risposta

15

Purtroppo i due non sono equivalenti. (In particolare, i NaN e gli zeri firmati non utilizzano il confronto bit a bit all'interno della FPU).

Quindi dovresti fare la tua scelta in base alla correttezza, non alla velocità.

+1

Giusto, me ne sono completamente dimenticato. Suppongo che l'errore di Rookie. – Anthony

+1

@Duracell: l'errore del principiante è preoccupante per le prestazioni rispetto a un buon codice. :) Le prestazioni sono la tua ultima preoccupazione. – GManNickG

+1

@GMan: Potresti dire questo, ma avevo completamente trascurato il fatto che memcmp non avrebbe funzionato. Senza questo, ho pensato che il mio codice fosse buono e potessi quindi guardare alla velocità. – Anthony

Problemi correlati