次の関数テンプレートは、ポインタの境界調整を求めるためのものです。厳密にいえば、ポインタを汎整数型に型変換した場合、それを元の型に再変換して値が変わらないこと以外、すべて処理系定義になるわけですが、実際にはポインタの値==アドレスと考えて問題ないケースがほとんどですので、その仮定の下で実装することにします。
0 1 2 3 4 5 6 |
template <typename T> inline std::size_t pointer_alignof(T const* value) { return static_cast<std::size_t>(lowest_one_bit(reinterpret_cast<std::uintptr_t>(value))); } |
なお、lowest_one_bit関数テンプレートは、1.13 無符号整数の最下位の ‘1’ のビットだけを抽出する。で定義したものです。
この関数で得られるのは、境界調整要求サイズではなくその倍数になります。境界調整要求サイズを得るのであれば、lowest_one_bit関数ではなく5.2 型のアラインメントを返す。で作成したalignofを使えば実現できます。