3

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

4

1 に答える 1

5

D コンパイラが構造体のメンバーを再配置することは、実際には違法です (ただし、クラスに対しては可能です)。構造体は、特定のメモリ レイアウトを必要とする低レベルのものに使用できると想定されているため、コンパイラが構造体のメンバーを再配置しないことが重要です。また、構造体が C コードとやり取りできる必要がある場合もあるため、C で得られるものと一致する必要があります (少なくともextern(C)を使用する場合)。したがって、構造体は間違いなくメンバーを再配置しません。さらに、align属性を介してメンバーの配置を指定できるため、構造体のレイアウトを完全に制御できます。

現在、デフォルトのレイアウトはアーキテクチャによって異なる場合があります (たとえば、64 ビット ポインターは 32 ビット ポインターよりも多くのスペースを占有し、構造体メンバーがどのようにパックされるかに影響します)、そのアーキテクチャで C で得られるものと一致するはずです。 .

于 2016-08-19T04:48:31.760 に答える