オブジェクトのアライメントの問い合わせと指定をするためには、ヘッダー<stdalign.h> をインクルードします[1]

マクロ編集

<stdalign.h> では、4つのマクロが定義されます。

alignas
キーワード _Alignas に展開されます。
alignof
キーワード _Alignof に展開されます。
_alignas_is_defined
整数の定数1に展開されます。
_alignas_is_defined
整数の定数1に展開されます。

_alignas_is_defined_alignof_is_defined は、#if 前処理ディレクティブでの使用に適しています。

alignas編集

alignas()は、変数を宣言するにあたりアライメントをバイト単位で指定します[2][3]

#include <stdalign.h>
#include <stdio.h>

int main(void) {
  alignas(65536) int i;
  alignas(256) int j;
  int k;
  printf("iのアドレスは%p\n", &i);
  printf("jのアドレスは%p\n", &j);
  printf("kのアドレスは%p\n", &k);
  return 0;
}
結果
iのアドレスは0x7ffffffe0000
jのアドレスは0x7ffffffeff00
kのアドレスは0x7ffffffeffec

alignof編集

alignof() は、指定した型が要求するアライメントを size_t で返します[2][3]

#include <stdalign.h>
#include <stdio.h>

int main(void) {
  printf("charのアラインメント要件は%zu。\n", alignof(char));
  printf("intのアラインメント要件は%zu。\n", alignof(int));
  printf("floatのアラインメント要件は%zu。\n", alignof(float));
  printf("doubleのアラインメント要件は%zu。\n", alignof(double));
  return 0;
}
結果
charのアラインメント要件は1。
intのアラインメント要件は4。
floatのアラインメント要件は4。
doubleのアラインメント要件は8。

歴史編集

alignas型指定子(キーワード_Alignas)、alignof演算子(キーワード_Alignof)、ヘッダー<stdalign.h>、ISO/IEC 9899:2011で追加されました[1]

脚註編集

  1. ^ 1.0 1.1 C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p.268, §7.15 Alignment <stdalign.h>. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 
  2. ^ 2.0 2.1 C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p.48, §6.2.8 Alignment of objects. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 
  3. ^ 3.0 3.1 C11: WG14/N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p.127, §6.7.5 Alignment specifier. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 

関連項目編集

参考文献編集