2016-08-19 6 views
3

D構造体の正確なレイアウトは定義されていますか?つまり、定義されたすべてのメンバの正確なオフセットと、コンパイラに依存しない方法です。これは、コンパイラがあなたのニーズに応じて、幸いにも、残念なことに、小項目の最適なパッキングを得るためにフィールドを並べ替えることを禁止し、すべてのオフセットを最小限に抑えることを意味します。D構造体の正確なレイアウトは定義されていますか?

答えて

5

Dコンパイラが構造体のメンバを再配置することは本当に不正です(ただし、クラスはです。)。構造体は特定のメモリレイアウトを必要とする低レベルのものに使用できるはずであるため、コンパイラは構造体のメンバを再配置しないことが重要です。また、構造体がCコードと対話できる必要があるため、C言語で取得するものと一致する必要があります(少なくともextern(C)を使用した場合)。したがって、構造体はメンバーの並べ替えを間違いなく行います。さらに、align attributeを介してメンバーのアラインメントを特定することができるので、構造体のレイアウトを完全に制御できます。

デフォルトのレイアウトはアーキテクチャによって異なる場合があります(たとえば、64ビットポインタは32ビットポインタよりも多くの領域を占め、構造体メンバのパック方法に影響します)が、そのアーキテクチャ上のC。

+0

有益かつ明確な投稿に感謝します –

+0

これは、ワードの奇数アドレスなどの不適切なデータが不正なアーキテクチャーのDコンパイラー(M68000、PDP-11など)は、複数の1バイトのフェッチまたはストア? –

+0

@CecilWard AFAIKでは、現在のところ、Dコンパイラはこのようなアーキテクチャをサポートしていません。正式な仕様には多くの優れた情報がありますが、リファレンスコンパイラの仕様は事実上仕様です(また、dmdはx86/x86_64のみ) 。だから、gdcやldcの問題が出ていなければ、議論されていないかもしれません。その答えは、Dコンパイラは対応するCコンパイラが何をしても実行することを期待していますが、わかりません。 –

関連する問題