とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

_Alignとは (_Alignasとは)

追記:
現ドラフトN1516では _Align ではなく,_Alignas というキーワードに名称が変更されているようです。


C言語の次期規格C1Xでは_Alignキーワードが新たに導入される予定です。それがどんなものか知るべく,ドラフトを _Align で検索して,見つかったあたりの文章を翻訳してみました。用語はある程度 JIS X 3010:2003 に倣うようにしているつもりですが,英検五級が本気を出しましたので,間違いは多いと思われます。翻訳おかしいところはぜひご指摘ください。
いくつかのC1Xの新語は独自に訳しています。例:fundamental alignment を基本境界調整と訳すなど。

_Alignキーワードについて

6.2.8 Alignment of objects
1 Object types have alignment requirements which place restrictions on the addresses at
which objects of that type may be allocated. An alignment is an implementation-defined
integer value representing the number of bytes between successive addresses at which a
given object can be allocated. An object type imposes an alignment requirement on every
object of that type: stricter alignment can be requested using the _Align keyword.

6.2.8 オブジェクトの境界調整
オブジェクト型はその型のオブジェクトが割り当てられるかもしれないアドレスの制限を置く境界調整要求を持つ。 境界調整は与えられたオブジェクトを割り当てられることができる連続したアドレスの間のバイト数を表す処理系定義の整数値である。 オブジェクト型はその型のあらゆるオブジェクトに境界調整要求を課す: _Align キーワードを使用することで、より厳密に境界調整を要求できる。

6.7.5 Alignment specifier
Syntax
1 alignment-specifier:
_Align ( type-name )
_Align ( constant-expression )

6.7.5 境界調整指定子
構文規則
境界調整指定子:
_Align ( 型名 )
_Align ( 定数式 )

Constraints
2 An alignment attribute shall not be specified in a declaration of a typedef, or a bit-field, or
a function, or a parameter, or an object declared with the register storage-class
speciifer.

制約
境界調整属性は typedef 宣言、ビットフィールド、関数、仮引数,register 記憶域クラス指定子の伴なうオブジェクトの宣言で指定してはならない。

3 The constant expression shall be an integer constant expression. It shall evaluate to a
valid fundamental alignment, or to a valid extended alignment supported by the
implementation in the context in which it appears, or to zero.

定数式は整数定数式でなければならない。それは有効な基本境界調整、またはそれが現れる文脈で処理系がサポートする有効な拡張境界調整,または0へと評価されなければならない。

4 The combined effect of all alignment attributes in a declaration shall not specify an
alignment that is less strict than the alignment that would otherwise be required for the
type of the object or field being declared.

(わけわかめ)
宣言におけるすべての境界調整属性の組み合わせた結果は オブジェクトまたはフィールドの宣言された型で要求された境界調整より厳しくない境界調整を指定してはならない。

Semantics
5 The first form is equivalent to _Align(alignof(type-name)).

意味規則
最初の形式は _Align(alignof(型名)) と同等である。

6 The alignment requirement of the declared object or field is taken to be the specified
alignment. An alignment specification of zero has no effect. When multiple alignment
specifiers occur in a declaration, the effective alignment requirement is the strictest
specified alignment.

宣言されたオブジェクトまたはフィールド*1の境界調整要求はその指定された境界調整を持つ。0の境界調整指定は何の効果ももたない。宣言が複数の境界調整指定子持つとき,有効な境界調整要求は最も厳密に指定された境界調整となる。

7 If the definition of an object has an alignment specifier, any other declaration of that
object shall either specify equivalent alignment or have noalignment specifier. If
declarations of an object in different translation units have different alignment specifiers,
the behavior is undefined.

もしオブジェクトの定義が境界調整指定子を持つならば,そのオブジェクトの他の宣言は同等の境界調整を指定するか境界調整指定子を持たないようにしなければならない。もし異なる翻訳単位のオブジェクト宣言が異なる境界指定子を持つならば,その動作は未定義とする。

関係する構文規則まとめ

declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
alignment-specifier declaration-specifiersopt
alignment-specifier:
_Align ( type-name )
_Align ( constant-expression )

参照元

Draft N1425 (PDF)
6.4.1 Keywords
6.2.8 Alignment of objects
6.7.5 Alignment specifier
6.7 Declarations

*1:ビットフィールドのことなのか,構造体メンバのことなのかよく分からず。C99, C1X それぞれで field を検索してみたのですが…。いや,制約でビットフィールドに境界調整指定子つけられないから,構造体メンバのことかも。何でここだけ field なんて表現使うんだ…。