10

msdnはそれを言います

sizeof演算子は、安全でないコードブロックでのみ使用できます。Marshal.SizeOfメソッドを使用できますが、このメソッドによって返される値は、sizeofによって返される値と常に同じであるとは限りません。

Marshal.SizeOfは、型がマーシャリングされた後のサイズを返しますが、sizeofは、**パディング**を含む共通言語ランタイムによって割り当てられたサイズを返します。

本を読んだら:clr経由のc#(522ページ)

それ : ここに画像の説明を入力してください

質問:

1)ここで言及されているパディングはありますか:

ここに画像の説明を入力してください

本で言及されているものと同じですか?

2)オブジェクトタイプが-MEMORYでそのTRUEサイズPersonを知るにはどうすればよいですか?

編集-なぜ私はそれが必要なのですか?

これに注意してください:

彼らは記録を読むサンプルを持っています:

 using (var accessor = mmf.CreateViewAccessor(offset, length))
            {

                int colorSize = Marshal.SizeOf(typeof(MyColor)); //<--------HERE
                MyColor color;


                for (long i = 0; i < length; i += colorSize)
                {
                    accessor.Read(i, out color);
                    color.Brighten(10);
                    accessor.Write(i, ref color);
                }
            }
        }

報告されているサイズがそのようなサイズでMARSHAL.sizeOFないsizeOF場合-どちらを選択する必要がありますか?それは正確でなければなりません!!

このサンプルによると、彼らはパディングを考慮していません、そして彼らは...(またはそうではない...)

4

1 に答える 1

5

これは不誠実に見えるかもしれませんが、メモリマップトファイルの観点から関心のあるサイズは、メモリ内のそのオブジェクトのサイズと同じではありません。これらはメモリマップトファイルと呼ばれることもありますが、.Netでは、ネイティブコードの場合とまったく同じことを意味するわけではありません。 (基本的な実装は同じですが、論理メモリのセクションはファイルのセクションにマップされているため、名前は正しいです)

sizeofパディングバイトなどを含む、物理メモリ内のオブジェクトの正しいサイズを返します。したがって、ネイティブメモリの用語でオブジェクトの正確なサイズを知る必要がある場合は、それを使用します(ただし、これはメモリマップトファイルには適用されません。すぐに説明します)。

ドキュメントに記載されているようにMarshal.SizeOf、2つの非表示のデータ項目を除いて、.Netの観点からオブジェクトのサイズを報告します。ランタイムでのみ使用されます。

コピーした例ではMarshal.SizeOf、パディング値がメモリ内の物理オブジェクトにのみ関連しているため、を使用しています。オブジェクトがシリアル化されると、論理.Netデータのみがシリアル化されます。オブジェクトが再度ロードされると、その時点でのランタイムの状態に基づいて、これら2つのパディングされた値が再割り当てされます。例:タイプポインタは異なる場合があります。それらをシリアル化することは無意味です。これは、ネイティブポインタ(オフセットではない)をディスクにシリアル化するようなものです。次回、ポインタが指すデータが同じ場所にある可能性はほとんどありません。

エルゴ-100個のColorオブジェクトの配列が物理メモリでどれだけ使用しているかを知りたい場合はsizeof、;を使用してください。同じデータのメモリマップトファイルのサイズを知りたい場合は、を使用してMarshal.SizeOfください。

于 2012-05-15T14:20:02.773 に答える