2

AlignmentAdaからC構造体をラップするときに、Adaタイプ属性が必要になるのはいつですか。

典型的なラッパー構造は次のようになります

type T is record
  a : aliased Interfaces.C.unsigned_char;
  b : aliased Interfaces.C.double;
end record;

さて、いつ/どこに

for T'Alignment use 8;

必要ですか?

そして、これはターゲットアーキテクチャに依存しますか?

4

2 に答える 2

3

Ada 2012 LRM の「アライメント」の定義。

'アライメントが型に関連付けられている場合、その型のオブジェクトのアドレスは、アライメント値で割り切れる必要があります。

したがって、あなたの定義では、型 T のオブジェクトをアドレス 800 に明示的に配置するか、コンパイラによって自動的に割り当てることができますが、804 には配置されません。

これは、ダブル ワード (8 バイト) 境界で始まる double など、特定のデータ型がアラインメント制約に従う必要がある場合に関係します。(これは、ターゲット アーキテクチャに依存します。このような制約を課すものもあれば、課さないものもあります。) 同様に、一部のアーキテクチャでは、マルチバイト値を奇数アドレスで開始できる場合があります。

この問題は、外部で定義されたものと一致する Ada レイアウトを定義する必要がある場所を説明するような状況で発生する可能性が最も高くなります。'Alignment を指定すると、オブジェクトとレコード コンポーネントが外部ソースと一致するように適切にレイアウトされます。

多くの場合、特に C とのインターフェイスの場合、コンベンションアスペクトまたはプラグマを対応する型定義に適用するだけで、Ada レイアウトが C レイアウトと自動的に一致し、詳細なアラインメントとパディングはすべてコンパイラに任せることができます。

于 2012-11-28T16:55:25.123 に答える
2

アライメント属性の目的は、C 互換性をサポートすることではなく、データ (一部の CPU、最も一般的には float と FPU の一部のデータを含む) に対して特別なアライメント制限を持つハードウェアとの互換性を提供することです。

そうは言っても、技術的には、Ada コードと互換性を持たせようとしている C コンパイラで使用されるアラインメント規則を知っている状況では、C との互換性に役立つと思います。

この特定のケースでは、コンパイラーが T 型のすべてのオブジェクトをクワッドワード境界に配置するようにするのではないかと思います。ただし、コンパイラは、T オブジェクトの中央に 7 バイトの埋め込みを配置して、確実にdoubleクワッドワード境界にも配置することを選択する場合があります。レコード表現句も強制的に使用しないと、何とも言えません。レコード構造の内部がどのようにレイアウトされているかが気になる場合 (たとえば、C レイアウトと確実に一致するようにしたい場合) は、おそらくそれについて明示する必要があります。

于 2012-11-29T15:54:19.733 に答える