快速比较无符号数的数组

时间:2016-11-23 11:42:50

标签: c++ arrays performance compare memcmp

考虑以下代码:

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:

谢谢你的回答。正如我现在看到的,如果sizeof(array) <= 64bit

,CmpHashArray可以归结为1比较

如果此代码可以更快地运行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 个答案:

没有答案