それは問題です。 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. 構造体と共用体
- 3. Haskell FFI for C再帰的構造体と共用体
- 4. 返信構造体.net dll(C#)
- 5. .NETのラッパータイプ:構造体またはクラス?
- 6. 構造体である.NETコレクション
- 7. C構造体の質問
- 8. (C/C++)構造体を含む共用体を含む構造体...?
- 9. Cの関数のtypedef構造体と構造体の相違
- 10. void *へのキャストと基本構造体ポインタとの間にパフォーマンスの違いはありますか?
- 11. UITextFieldは構造体または共用体ではありませんか?
- 12. Android NativeActivity:AttachCurrentThread JNIInvokeInterfaceが構造体または共用体ではありません
- 13. 構造体または共用体でないメンバーのリクエスト
- 14. 構造体と共用体の間にサイズの不一致があるのはなぜですか?
- 15. メンバー参照の基本タイプが構造体または共用体ではありません
- 16. 私はTAILQ構造体持っている間違った構造体とmmap
- 17. 基本的なC++関数のポインタと構造体
- 18. メンバ参照の基本タイプ 'double'は構造体または共用体ではありません
- 19. .NETの構造体はコピーライト時にコピーされますか?
- 20. 構造体型のYacc共用体
- 21. 構造体のコンストラクタを使用しようとすると "関数が構造体または共用体の一部ではありません"
- 22. CvCapture構造体とVideoCapture構造体の違いは何ですか?
- 23. スウィフト構造体のリファレンス私はWWDC2016で構造体</p> <p>について質問があり
- 24. C構造体内の構造体内部の構造体
- 25. JavaにCの構造体がありますか?
- 26. C++の構造体内の構造体
- 27. iphoneココア「エラー:何かない構造体または共用体のメンバのリクエスト____」
- 28. 配列はCプログラミング言語の構造体および共用体とどう違うのですか?
- 29. 構造体内に `initializer_list` ctorを持つ構造体はありますか?
- 30. 他の構造体を指す構造体ポインタメンバがセグメンテーションフォールト(C/C++)
マーシャリングは、ネイティブデータになったらレイアウトと関係します。 IntPtrはまだC#型です。データ領域にマーシャリングされるまでは、管理対象プラットフォームの下にメンバとして存在します。 –