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バイトで整列されたアドレス。それらが一致する場合は、またがらないことがわかります。

これを行うためのより速い方法はありますか?私はこれを作りました、標準的なチェックがあるかどうかはわかりません。

編集:注意してください、私はNよりも小さいTを想定しています。

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 に答える