- cpp11[meta cpp]
alignof()
は、指定した型がメモリ上のどの位置に配置されるか(アライメント)取得する演算子である。「アライン オブ (align of)」と読む。
sizeof()
と異なりalignof()
は変数には使用できない。
例えば型int
が4バイト境界の位置にアライメントされるシステムであれば、alignof(int)
は4を返す。
alignof(型)
は、指定した型のアライメントのサイズを返す。戻り値の型はstd::size_t
である。
もっとも制約の弱い、すなわちアライメントのサイズが最小となる型はchar
, signed char
, unsigned char
であり、
もっとも制約の強い、すなわちアライメントのサイズが最大となる型はstd::max_align_t
である。
#include <cstddef>
#include <iostream>
struct hoge {
char c[63];
short s;
double i;
};
struct empty {
};
int main()
{
std::cout <<
"std::max_align_t: " << alignof(std::max_align_t) << std::endl <<
"char: " << alignof(char) << std::endl <<
"int: " << alignof(int) << std::endl <<
"double: " << alignof(double) << std::endl <<
"struct hoge: " << alignof(hoge) << std::endl <<
"struct empty: " << alignof(empty) << std::endl <<
"char *: " << alignof(char *) << std::endl;
return 0;
}
- std::max_align_t[link /reference/cstddef/max_align_t.md]
x86向けLinux上で実行した場合。
std::max_align_t: 8
char: 1
int: 4
double: 8
struct hoge: 4
struct empty: 1
char *: 4
C++03で型のアライメントサイズを得るにはコンパイラの拡張機能を利用するしかなく、コンパイラごとに異なる記述を行う必要があったが、C++11ではどのコンパイラでも同じ記述でアライメントサイズが取得できる。
N2341 からはわからない、恐らくないと思われる。