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.
你可以这样做:
unsigned long offset = (unsigned long)obj & (N-1);
return offset > N - sizeof(T);
Run Code Online (Sandbox Code Playgroud)
(此代码与您的代码一样,只有在N为2的幂时才有效.)
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |