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を想定しています。