2017-02-14 6 views
1

私はコンパイラの設計と実装に関する本を読んでいます。ストレージ管理に関する部分では、著者はメモリを割り当てるための関数を書く。彼は、関数が任意の型に対して適切に整列されることを望んでいます。彼は、以下のユニオンのサイズは、ホストマシン上の最小アライメントであると主張しています。私はそれがどういう意味か分かりません。本から: "...そのフィールドは、最も厳密な位置合わせの要件を持つ可能性が最も高いフィールドです。"マシンの最小アライメント要件

union align { 
    long l; 
    char *p; 
    double d; 
    int (*f) (void); 
}; 

「厳密なアライメント要件」とはどのような意味ですか、これがホストマシン上の最小アライメントをどのように説明しますか?

答えて

4

ユニオンのアライメントは、アライメント要件が最も厳しいメンバーのアライメントと同じになるように選択されます。そのサイズは、最大のメンバと同じ大きさに選択され、配列の中に順番に配置されたときにアライメントが破られないように、最終的にいくつかの追加のパディングが追加されています。

だから意味で、union alignが(最大アライメント要求を有す​​る方)lpd又はfいずれかと同じ配向を有することになります。タイプint (*)(void)であるf部材が8のアライメント要求を有す​​る場合

は、例えば、全体の組合はlongのみ4必要とする場合であっても、8バイト境界で整列されます。

標準では、これらの4つのタイプから最大のアライメント要件が「ホストマシン上の最小アライメント」になるかどうかは不明です。コンパイラがストレージ管理に関してどのように動作するかを理解するためには、ちょうど良い演習かもしれません。

3

メモリバスの制限により、偶数アドレスからのみ16ビット値を読み取ることができるマシンを考えてみます。

そのようなマシン上で16ビットの値ではないがunion策略に頼るを行い2.

の「整列要求」を有することになります。 C11ので、あります

  • max_align_tプラットフォームの最大(標準)スカラ型(1)、malloc()によってサービス提供されるよう配向を有する、すなわちタイプと同義です。
  • _Alignofです。これは、特定のタイプのアライメント要件を示します。
  • alignasこれは、タイプのアライメントを変更することを可能にします。

(1):最大のようなタイプでしょう通常コンパイラは特別な処理を必要とし、「拡張子」タイプをサポート可能性があることを

注...、あなたの本の例から怪しい欠席タイプlong doubleこと。たとえば、256バイトのSSEデータ型を持ちますが、malloc()が「のみ」の場合、128バイトのアライメントが行われます。

関連する問題