Actualmente estoy trabajando en una base de código donde las direcciones IPv4 se representan como punteros a u_int8
. El operador de igualdad se implementa como esto:Comparación rápida de matrices de caracteres?
bool Ipv4Address::operator==(const u_int8 * inAddress) const
{
return (*(u_int32*) this->myBytes == *(u_int32*) inAddress);
}
Esta es probablemente la solución de ayuno, pero hace que la advertencia compilador GCC:
ipv4address.cpp:65: warning: dereferencing type-punned pointer will break strict-aliasing rules
¿Cómo puedo volver a escribir la comparación correctamente sin romper las reglas estrictas-aliasing y sin perder puntos de rendimiento?
me han considerado el uso de cualquiera o memcmp
esta macro:
#define IS_EQUAL(a, b) \
(a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
Estoy pensando que la macro es la solución más rápida.
¿Qué me recomiendas?
actualización
acabo de leer el artículo de Squeezing performance out of memcmp usage que explica como el compilador (Visual Studio, pero quizás también GCC) pueden optimizar !memcmp(..)
llamadas.
¿Has probado las diferentes opciones y las has comparado para ver cuál es realmente el más rápido? –
@Nick Meyer, aún no, pero es una buena sugerencia. – StackedCrooked