D構造体の正確なレイアウトは定義されていますか?つまり、定義されたすべてのメンバの正確なオフセットと、コンパイラに依存しない方法です。これは、コンパイラがあなたのニーズに応じて、幸いにも、残念なことに、小項目の最適なパッキングを得るためにフィールドを並べ替えることを禁止し、すべてのオフセットを最小限に抑えることを意味します。D構造体の正確なレイアウトは定義されていますか?
3
A
答えて
5
Dコンパイラが構造体のメンバを再配置することは本当に不正です(ただし、クラスはです。)。構造体は特定のメモリレイアウトを必要とする低レベルのものに使用できるはずであるため、コンパイラは構造体のメンバを再配置しないことが重要です。また、構造体がCコードと対話できる必要があるため、C言語で取得するものと一致する必要があります(少なくともextern(C)
を使用した場合)。したがって、構造体はメンバーの並べ替えを間違いなく行います。さらに、align
attributeを介してメンバーのアラインメントを特定することができるので、構造体のレイアウトを完全に制御できます。
デフォルトのレイアウトはアーキテクチャによって異なる場合があります(たとえば、64ビットポインタは32ビットポインタよりも多くの領域を占め、構造体メンバのパック方法に影響します)が、そのアーキテクチャ上のC。
関連する問題
- 1. 正しい構造体の定義
- 2. D構造体コピーコンストラクタ
- 3. 私の構造体はどのファイルに定義されていますか?
- 4. 構造体定義のマクロを定義しています
- 5. 空の構造体はC++標準で定義されていますか?
- 6. 構造体に、定義されていない別の構造体へのポインタが含まれているのはなぜですか?
- 7. 構造体の再定義
- 8. Cの構造体定義
- 9. Dojo Data Grid - 構造体によって定義されていないカスタム行
- 10. アーキテクチャの定義されていないシンボルx86_64:ヘッダファイルに定義された構造体を使用
- 11. ユーザ定義構造体
- 12. Golang構造体定義パターン
- 13. D純粋なクラスや構造体
- 14. グローバル構造体を定義するグローバル構造体
- 15. 最適なC構造体定義
- 16. 構造体が型として定義されていません
- 17. COMインターフェイスで渡された構造体のパッキングは定義されていますか?
- 18. gpuメモリに渡された構造体は未定義です。構造体をCudafyに渡すには?
- 19. あらかじめ定義された構造体を持たないExcelインポート
- 20. この構造体定義でコロンは何をしますか?
- 21. googleでxmlを解析する構造体の正しいレイアウト
- 22. 構造体にコンストラクタを定義しています
- 23. ユーザー定義の構造体ポインタ{}をユーザー定義の構造体ポインタにアンマーシャリングします。
- 24. 私はこのような単純な構造体定義されたファイル
- 25. COM相互運用構造定義は、COMヘッダ(vds.h)で定義された構造体があり、メモリレイアウト
- 26. はF#の構造体にリストされていますか?
- 27. Cの構造体定義内で構造体ポインタを使用するのはなぜですか?
- 28. タイプリテラルで定義されたタイプの構造体フィールドのメソッド
- 29. 構造体とタプルのテンプレートパラメータD
- 30. Cの構造体定義のバリエーション
有益かつ明確な投稿に感謝します –
これは、ワードの奇数アドレスなどの不適切なデータが不正なアーキテクチャーのDコンパイラー(M68000、PDP-11など)は、複数の1バイトのフェッチまたはストア? –
@CecilWard AFAIKでは、現在のところ、Dコンパイラはこのようなアーキテクチャをサポートしていません。正式な仕様には多くの優れた情報がありますが、リファレンスコンパイラの仕様は事実上仕様です(また、dmdはx86/x86_64のみ) 。だから、gdcやldcの問題が出ていなければ、議論されていないかもしれません。その答えは、Dコンパイラは対応するCコンパイラが何をしても実行することを期待していますが、わかりません。 –