7

データ型についての理解を深め、データ型の大きさをどのように判断できるかを知りたいと思います。私は答えへの旅が他の未知のものを明らかにすることを望んでいます。

.NETでは、バイトは8ビットの符号なし整数であることを知っていますが、それは私がそれについて読んだからです。次のような非常に単純なコンソールアプリがある場合:

static void Main(string[] args)
{
byte b = 1;
}

Visual Studioで、「b」のデータ構造の大きさをどのように知ることができますか?いくつかのメモリ診断ウィンドウがあるように見えますが、bの割り当てをステップオーバーすると、式を評価できないとだけ表示されます。逆アセンブリウィンドウを開いて、movop...を見ることができます。

mov         dword ptr [ebp-40h],1

...しかし、情報が何を意味するのかわかりません。dwordがサイズを示唆していて、おそらくptrebp-40hがアドレスを指していると思います。Visual Studioですべてのアドレスを確認し、範囲を確認してサイズを収集する方法はありますか?

私はこれらがこのような短いフォーラムで答えるのが難しい質問であることを知っていますが、助けてくれてありがとう。

4

5 に答える 5

8

を使用sizeof(T)して、プリミティブ値型と非参照型のサイズを取得できます。他のタイプの場合、参照型は一般に固定サイズではないため、サイズを取得するのは非常に難しい場合があります。

これは、単純な型以外では複雑な問題になる可能性があります(以下の説明による)が、一般に、型のサイズがそれ自体が参照型であるためにデータ構造によって明示的に定義されていない場合、または参照型を含む構造である場合、その場合、ストレージを計算する方法はありません(定義上、固定されていないため)。

于 2012-06-20T19:02:31.177 に答える
4

tl; dr: sizeof(YourType)「答え」を与えるはずですが、Marshal.SizeOfもっと適切かもしれません。

説明:

それが常に機能するとは限りません。C#は、抽象化の障壁を打ち破ることを好まないため、構造がマネージコードとアンマネージコードで同じサイズである(より正確には「ブリット可能」である)場合にのみ、構造の「サイズ」を見つけることができます。それ以外の場合、C#は「なぜマネージドサイズを気にするのですか?それは役に立たない」と主張し、マネージドタイプを採用することはできません。sizeof

これを回避する方法はいくつかありますが(MSILを直接生成することで)、実際に同じオブジェクトのアンマネージMarshal.SizeOf表現のサイズが必要な場合は、代わりに使用することをお勧めします。sizeof実際には、見た目ほど便利ではありません。もっと便利です。

于 2012-06-20T19:13:44.247 に答える
2

オブジェクトのサイズに真の値を与えるハードコアSOSオプションもあります。

!ObjSizeコマンドを使用

==Immediate Window==
.load sos
!ObjSize <address>

オブジェクトのアドレスを取得するために、いろいろと調べてみる必要があるかもしれません。や!Dump*などのコマンドを確認してください。!DumpHeap!DumpStack

于 2012-06-20T19:31:00.107 に答える
1

よく理解しているかどうかはわかりませんが、演算子sizeof()があります。

Console.WriteLine(sizeof(byte));

参照型に関連する答えもあります:C#でフィールドのサイズをバイト単位で取得する

于 2012-06-20T19:03:44.847 に答える
1

あなたが求めているのは、特定のデータ型がどれだけのメモリを消費するかということだと私は確信しています。sizeof()メソッドを使用するので、次のようになります。

int a = 2;

intが占めるスペースの量を見つけることができます:

Console.WriteLine(sizeof(int);
于 2012-06-20T19:09:20.267 に答える