В настоящее время я работаю в кодовой базе, где адреса IPv4 представлены в виде указателей на u_int8
. Оператор равенства реализуется следующим образом:Быстрое сравнение массивов символов?
bool Ipv4Address::operator==(const u_int8 * inAddress) const
{
return (*(u_int32*) this->myBytes == *(u_int32*) inAddress);
}
Это, вероятно, постились решение, но оно вызывает предупреждение GCC компилятора:
ipv4address.cpp:65: warning: dereferencing type-punned pointer will break strict-aliasing rules
Как я могу переписать сравнение корректно, не нарушая правил строгого сглаживания и без потери очков производительности?
Я рассматривал возможность использования либо memcmp
этого макроса:
#define IS_EQUAL(a, b) \
(a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
Я думаю, что макрос является самым быстрым решением.
Что вы рекомендуете?
Update
Я только что прочитал статью Squeezing performance out of memcmp usage, которая объясняет, как компилятор (Visual Studio, но также, возможно, GCC) может оптимизировать !memcmp(..)
вызовы.
Вы пробовали разные варианты и сравнивали их, чтобы увидеть, что на самом деле самое быстрое? –
@ Ник Майер, еще нет, но это хорошее предложение. – StackedCrooked