x86-64上最快的方法来检查指针范围是否跨越N字节对齐的地址?

Jos*_*vin 0 c++ bit-manipulation x86-64 simd alignment

给定一个指向T的指针,我想确定T是否跨越N字节对齐的地址.在实践中我真的只关心0-5字节大小的对象是否跨越8或16字节字节边界,但我写了这个通用版本:

template<class T, unsigned long N>
bool straddlesBoundary(T* obj)
{
    unsigned long before = (unsigned long)obj & ~(N-1);
    unsigned long after  = ((unsigned long)obj + sizeof(T) - 1) & ~(N-1);
    return before != after;
}
Run Code Online (Sandbox Code Playgroud)

基本上,将地址向下舍入到最接近的N字节对齐地址,然后将指针增量乘以T的大小减1(因为T在下一个边界上的右边不算作跨骑)并将其向下舍入到最近N字节对齐的地址,如果匹配,则表示它不会跨越.

有更快的方法吗?我刚刚做了这个,我不知道是否有标准检查.

编辑:注意,我假设T小于N.

Kei*_*all 5

你可以这样做:

unsigned long offset = (unsigned long)obj & (N-1);
return offset > N - sizeof(T);
Run Code Online (Sandbox Code Playgroud)

(此代码与您的代码一样,只有在N为2的幂时才有效.)