2017-01-16 7 views
4

ダイナミックタイプは関連するタイプより多くのメモリサイズを使用していますか?ダイナミックタイプのメモリ使用量をC#

たとえば、フィールドでは4バイトしか使用しませんか?

dynamic foo = (int) 1488; 
+0

変数は引き続き 'int'なので、値は4バイトです。しかし、動的にプログラムを使用するための追加の一般的なオーバーヘッドがあります。 –

+0

その根底にある '動的'は、動的な型のように動作させるためにファンシーリフレクションの束を使用する単なる 'オブジェクト'です。それは、それが実際に表すタイプよりも多かれ少なかれデータを取ることはありません。 – Abion47

+0

あなたの答えはここにあります。 (最初の例に注意してください。動的型とオブジェクト型はどちらもSystem.Int32型を返します。)https://msdn.microsoft.com/en-us/library/dd264741.aspx – Sparrow

答えて

7

短い答え:それは実際に64ビットで32ビットマシン上で12バイト、24バイトを使用する

号。

ロング回答

dynamicタイプはオブジェクトとして保存されますが、実行時にコンパイラがdynamicタイプをどうするかの意味を理解するために、より多くのバイトをロードします。これを行うために、もっと多くのメモリがそれを理解するために使用されます。 dynamicのような気品のあるオブジェクトと考えてください。ここ

クラスである:ここ

class Mine 
{ 
} 

は32ビットで上記の目的のためにオーバーヘッドである:

-------------------------- -4 bytes 
| Object Header Word | 
|------------------------| +0 bytes 
| Method Table Pointer | 
|------------------------| +4 bytes for Method Table Pointer 

12バイトの合計が最小基準タイプのでに割り当てられる必要があります32ビットでは12バイトです。

私たちは、このようにそのクラスに一つのフィールドを追加する場合:

class Mine 
{ 
    public int Field = 1488; 
} 

をオーバーヘッドとintフィールドは12バイトに合うことができるので、それはまだ12のバイトがかかります。

intフィールドを追加すると、16バイトかかります。

しかし、我々はこのようにそのクラスに1つのdynamicフィールドを追加する場合:

class Mine 
{ 
    public dynamic Field = (int)1488; 
} 

をそれはは12バイトではありません。ダイナミックフィールドはobjectのように扱われるため、サイズは12 + 12 = 24バイトになります。

class Mine 
{ 
    public dynamic Field = (bool)false; 
} 

ダイナミックフィールドは唯一のブール値であっても、それはまだobjectのように扱われているためMineのインスタンスが24バイトになります。面白いです何

は、あなたの代わりにこれを行う場合です。

64ビットマシンでは、動的でMineのインスタンスは48バイトをとります。これは、64ビットの最小参照タイプが24バイト(24 + 24 = 48バイト)であるためです。

Hereは、あなたが知っておくとobjectの大きさのためthis答えが表示されるはずですいくつか落とし穴です。