それは問題です。 C#の明示的な構造体でできないことができるC++の共用体でできることはありますか?(.net).net Explicit構造体とC++共用体の間には本質的な違いがありますか?
答えて
C#明示的な構造体には、参照/ポインタサイズのメンバーに関していくつかの問題があります。
明示的に位置を指定する必要があるが、 "sizeof(IntPtr)"はコンパイル時定数ではないため(C++のsizeofとは異なります)、アセンブラを使用可能にするには明示的な構造体でポインタサイズのメンバーを使用することはできません32ビットと64ビットの両方のプロセスで使用できます。
はまた、参照とポインタの間で「変換」するために、明示的な構造体を使用することが可能である:あなたがこれを行うと
[StructLayout(LayoutKind.Explicit)]
struct Test
{
[FieldOffset(0)]
public IntPtr ptr;
[FieldOffset(0)]
public string str;
}
、あなたのアセンブリは、安全でないコードの許可が必要になります。 GCが構造体の内容をどうするのかわからないという問題があります.GCが追跡するポインタか、それは単なる整数ですか?
あなたの質問に答えてください: "C#でできないものはありますか?+明示的な構造体ではできません"
はい、ポインタの下位ビットに2ビットのデータを圧縮することはC++で役に立ちます。ポインターが整列されているとき、ポインターの2つの最下位ビットは常に0になるため、これが可能です。
2ビット整数の二重リンクリストを作成している場合は、ポインタとデータの両方を32ビットで保存することもできます。 ( "prev^next^data"、XOR linked listを参照してください)
しかし、GCを混乱させるので、C#のようなことはできません。
いいえ、実際はありません。 LayoutKind属性は、interop内のC++共用体にデータをマーシャリングする方法です。 C#の構造体を使ってレイアウトを完全に制御できるので、C++のunionキーワードよりはるかに柔軟です。
-1これは完全に間違っています。 Explicitは、正確なオフセットをより柔軟に制御できるように設計されています。連合サポートは主要な関心事ではなく、重複配列やその他の非配列型のような多くのものはまったく機能しません。 –
データの上に別のタイプの配列を重ねることはできません。たとえば、byte [4]とint16、int16をオーバーレイすることはできません。実行時にクラッシュします。
- 1. は、C++の構造体とC#の構造体に違いがありますか?
- 2. Haskell FFI for C再帰的構造体と共用体
- 3. .NETのラッパータイプ:構造体またはクラス?
- 4. 構造体である.NETコレクション
- 5. (C/C++)構造体を含む共用体を含む構造体...?
- 6. C構造体の質問
- 7. 構造体または共用体でないメンバーのリクエスト
- 8. UITextFieldは構造体または共用体ではありませんか?
- 9. 構造体と共用体の間にサイズの不一致があるのはなぜですか?
- 10. 私はTAILQ構造体持っている間違った構造体とmmap
- 11. メンバ参照の基本タイプ 'double'は構造体または共用体ではありません
- 12. 基本的なC++関数のポインタと構造体
- 13. 構造体のコンストラクタを使用しようとすると "関数が構造体または共用体の一部ではありません"
- 14. .NETの構造体はコピーライト時にコピーされますか?
- 15. CvCapture構造体とVideoCapture構造体の違いは何ですか?
- 16. C構造体内の構造体内部の構造体
- 17. iphoneココア「エラー:何かない構造体または共用体のメンバのリクエスト____」
- 18. JavaにCの構造体がありますか?
- 19. 構造体内に `initializer_list` ctorを持つ構造体はありますか?
- 20. は動的に私が動的にメンバーとして別の構造体を持つ構造体を割り当てています構造体
- 21. フレックス/ Bisonエラー:構造体または共用体ではないメンバー 'str'のリクエスト
- 22. エラー:構造体または共用体ではないメンバー 'id'の要求
- 23. エラー:構造体または共用体ではないメンバー 'a'の要求
- 24. "構造体または共用体ではないメンバーのリクエスト" more
- 25. 深い構造体のような.NETクラスのEquals()?
- 26. エラーC2228:「.values'の左側がクラス/構造体/共用体を持っている必要があります
- 27. C動的構造体(mallocと空き)
- 28. 異なる構造体内の構造体へのポインタ。 C
- 29. C++:なぜ構造体のベクトルが1つの構造体として機能していますか?
- 30. C構造体、構造体へのポインタ、適切な初期化
マーシャリングは、ネイティブデータになったらレイアウトと関係します。 IntPtrはまだC#型です。データ領域にマーシャリングされるまでは、管理対象プラットフォームの下にメンバとして存在します。 –