Je travaille actuellement dans une base de code où les adresses IPv4 sont représentées comme des pointeurs vers u_int8
. L'opérateur d'égalité est mis en œuvre comme ceci:Comparaison rapide des tableaux char?
bool Ipv4Address::operator==(const u_int8 * inAddress) const
{
return (*(u_int32*) this->myBytes == *(u_int32*) inAddress);
}
C'est probablement la jeûné solution, mais il provoque l'avertissement du compilateur GCC:
ipv4address.cpp:65: warning: dereferencing type-punned pointer will break strict-aliasing rules
Comment puis-je réécrire correctement la comparaison sans enfreindre les règles strictes-aliasing et sans perdre des points de performance?
J'ai envisagé d'utiliser soit memcmp
ou cette macro:
#define IS_EQUAL(a, b) \
(a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
Je pense que la macro est la solution la plus rapide.
Que recommandez-vous?
Mise à jour
Je viens de lire l'article Squeezing performance out of memcmp usage qui explique comment le compilateur (Visual Studio, mais peut-être aussi CCG) peuvent optimiser !memcmp(..)
appels.
Avez-vous essayé les différentes options et les comparé pour voir lequel est vraiment le plus rapide? –
@ Nick Meyer, pas encore, mais c'est une bonne suggestion. – StackedCrooked