境界調整(アラインメント)の要求サイズが必要になることがときどきあります。組込み開発ではとくに必要になることが多いのではないでしょうか?
C++11以降であれば、そのものずばりの機能であるalignof演算子が使えます。使い方はsizeof演算子とほぼ同じですが、オペランドには型しか指定することができません。
0 1 2 |
auto n = alignof(int); // int型の境界調整要求サイズ |
また、これもC++11以降になりますが、<type_traits>にstd::alignment_ofメタ関数が用意されています。得られる結果はalignof演算子と同じですが、メタ関数の体裁を取っています。
0 1 2 |
auto n = std::alignment_of<int>::value; // int型の境界調整要求サイズ |
C++11より前のバージョンの場合、TR1またはBoost C++ Librariesのboost::alignment_ofメタ関数を使うことができます。
どうしても自力で境界調整の要求サイズを求める必要がある場合、以下のようにして求めることもできます。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
template <typename T> class alignof { struct helper { char a_; T b_; }; public: static const std::size_t value = offsetof(helper, b_); }; std::size_t n = alignof<int>::value; // int型の境界調整要求サイズ |
また、GCC拡張には古くから__alignof__演算子が備わっています。__alignof__演算子はオペランドに型だけでなく式を受け取ることもできますが、移植性の問題があるのでなるべく使わない方がよいでしょう。