データ構造パティング
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/19 14:58 UTC 版)
「データ構造アライメント」の記事における「データ構造パティング」の解説
コンパイラ(またはインタプリタ)は、通常、アラインされた境界上に個々のデータ項目を割り当てるが、データ構造はしばしば異なるアライメント要件を有するメンバーを有する。適切なアライメントを維持するために、トランスレータは通常、追加の無名のデータメンバーを挿入して、各メンバーが適切にアライメントされるようにする。さらに、データ構造全体には、終端に名前のないメンバーが埋め込まれている場合がある。これにより、構造体配列の各メンバを適切にアラインすることができる。 パディングは、構造体のメンバの後に大きなアライメントが必要なメンバがある場合、または構造体の最後に挿入された場合にのみ挿入される。 構造体内のメンバの順序を変更することで、アライメントを維持するのに必要なパディングの量を変更することができる。例えば、アライメント要件の小さい順にメンバがソートされている場合、パディングは最小限で済む。必要なパディングの最小量は、常に構造体内の最大のアライメントよりも小さくなる。必要とされるパディングの最大量の計算は、より複雑だが、全てのメンバのアラインメント必要量から、構造体メンバの最小アライメントされた半分のアライメント必要量の合計の2倍を引いた値よりも小さい。 CとC++では、コンパイラがスペースを節約するために構造体メンバを並べ替えることはできないが、他の言語では可能である。また、大部分のC/C++コンパイラでは、構造体のメンバを一定のアラインレベルで「パック」することもできる。例えば、"pack(2)"は、バイトよりも大きいデータメンバを2バイト境界にアラインメントさせることを意味する。全てのパッディングメンバは最大で1バイト長である。 このような「パック」構造の用途の1つは、メモリを節約することである。例えば、1バイトと4バイトの整数を含む構造体には、さらに3バイトのパディングが必要となる。このような構造体の大きな配列は、パックされている場合はメモリ使用量を37.5%減らすことができるが、各構造体へのアクセスには時間がかかる。この妥協は、時間と空間のトレードオフの一形態と考えることができる。 「パック」構造の使用は、メモリ空間を節約するために最も頻繁に使用されるが、標準プロトコルを使用して送信するためにデータ構造をフォーマットするために使用することもできる。しかし、この使用法では、構造体メンバの値が、プロトコルによって要求されるエンディアン(多くの場合ネットワークバイトオーダ)で格納されるように注意する必要がある。これは、ホストマシンがネイティブに使用するエンディアンとは異なる場合がある。
※この「データ構造パティング」の解説は、「データ構造アライメント」の解説の一部です。
「データ構造パティング」を含む「データ構造アライメント」の記事については、「データ構造アライメント」の概要を参照ください。
- データ構造パティングのページへのリンク