быстрое сравнение массива чисел без знака

Рассмотрим этот код:

constexpr size_t size = 32;
constexpr size_t count = 8;
using WordCode = unsigned;

template<typename T>
int CmpHashArray(const T *l,const T *r)
{
auto * l1 = reinterpret_cast<const __int32*>(l);
auto * r1 = reinterpret_cast<const __int32*>(r);
if(*l1 == *r1)
return 0;
if(*l1 < *r1)
return -1;
return 1;
}

int CmpHashArray2(const WordCode *l,const WordCode *r)
{
return memcmp(l, r, size);
}
int main(...)
{
WordCode a1[count], a2[count];
CmpHashArray(a1, a2);
CmpHashArray2(a1, a2);
}

такое CmpHashArray имеет неопределенное поведение? Потому что с -O2 требуется 2 инструкции asm вместо memcmp.

UPD:

Спасибо за ответ. Как я вижу сейчас, CmpHashArray может сводиться к 1 сравнению, если sizeof(array) <= 64bit

если этот код может работать быстрее memcmp? (на 64 и 32-битных системах, кроссплатформенный)

    template<typename T,
size_t count,
typename std::enable_if<count*sizeof(T) % 64 == 0>::type
>
int CmpHashArray(const T *l,const T *r)
{
auto * l1 = reinterpret_cast<const __int64*>(l);
auto * r1 = reinterpret_cast<const __int64*>(r);
size_t iterCount = count*sizeof(T) / 64;
while(iterCount--) {
if(*l1 == *r1)
return 0;
if(*l1 < *r1)
return -1;
else
return 1;
++l1;
++r1;
}
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]