0

给定一个指向 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;
}

基本上,将地址向下舍入到最近的 N 字节对齐地址,然后将指针增量 T 减去 1 的大小(因为在下一个边界上结束的 T 不算作跨接)并将其向下舍入到最近的N 字节对齐的地址,如果它们匹配,您就知道它不会跨越。

有没有更快的方法来做到这一点?我只是编的,不知道有没有标准的检查。

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

4

1 回答 1

5

你可以这样做:

unsigned long offset = (unsigned long)obj & (N-1);
return offset > N - sizeof(T);

(与您一样,此代码仅在 N 是 2 的幂时才有效。)

于 2012-09-04T22:12:45.633 回答