ダイナミックタイプは関連するタイプより多くのメモリサイズを使用していますか?ダイナミックタイプのメモリ使用量をC#
たとえば、フィールドでは4バイトしか使用しませんか?
dynamic foo = (int) 1488;
ダイナミックタイプは関連するタイプより多くのメモリサイズを使用していますか?ダイナミックタイプのメモリ使用量をC#
たとえば、フィールドでは4バイトしか使用しませんか?
dynamic foo = (int) 1488;
短い答え:それは実際に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バイト)であるためです。
変数は引き続き 'int'なので、値は4バイトです。しかし、動的にプログラムを使用するための追加の一般的なオーバーヘッドがあります。 –
その根底にある '動的'は、動的な型のように動作させるためにファンシーリフレクションの束を使用する単なる 'オブジェクト'です。それは、それが実際に表すタイプよりも多かれ少なかれデータを取ることはありません。 – Abion47
あなたの答えはここにあります。 (最初の例に注意してください。動的型とオブジェクト型はどちらもSystem.Int32型を返します。)https://msdn.microsoft.com/en-us/library/dd264741.aspx – Sparrow