「オブジェクト」から継承し、フィールド/プロパティを持たないオブジェクトのメモリ量はどれくらいですか?そして私は方法がそうしないと思います。右 ?私は.netオブジェクトのために話しています。C#オブジェクトから取ったメモリ
答えて
さて、アンドリューとGuffaの両方が、私が間違っていると信じている答えを...与えているよう
(x86版)のすべてのオブジェクトのための8バイトのオーバーヘッドがありますが、そこだも 12の最小サイズバイト。私はなぜ知らない...しかし、それは、これら2つのクラスが両方は、インスタンスごとに12バイトを取ることを意味します
public class OneField
{
private int field;
}
public class NoFields
{
}
テスト:私は意図的ではないたので
using System;
public class OneField
{
private int field;
}
public class NoFields {}
public class Test
{
static void Main(string[] args)
{
int size = int.Parse(args[0]);
switch (args[1])
{
case "NoFields":
TestNoFields(size);
break;
case "OneField":
TestOneField(size);
break;
}
}
static void TestNoFields(int size)
{
NoFields[] array = new NoFields[size];
long start = GC.GetTotalMemory(true);
for (int i=0; i < size; i++)
{
array[i] = new NoFields();
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
Console.WriteLine("Size per instance: {0}",
(end-start)/(double)size);
}
static void TestOneField(int size)
{
OneField[] array = new OneField[size];
long start = GC.GetTotalMemory(true);
for (int i=0; i < size; i++)
{
array[i] = new OneField();
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
Console.WriteLine("Size per instance: {0}",
(end-start)/(double)size);
}
}
これは醜いですジェネリックタイプや問題の原因となる可能性のあるものは削除されます。いくつかのテストが実行されます。
>test 1000000 NoFields
Size per instance: 12.000024
>test 1000000 OneField
Size per instance: 12.000024
>test 1000 NoFields
Size per instance: 12
>test 1000 OneField
Size per instance: 12
(番号は常に正確な整数ではない理由JITtingオーバーヘッドなどを説明して - 私は浮動小数点で除算を行うので、その理由。)
テストを余分にint型のフィールドショーで使用量が16まで増え、実際に何か分かりやすいことが証明されています:)
最小限の12バイトについては良い点がありますが、質問の精神は、System.Objectからどのような情報が "継承されたか"正確に関係していると思います。あなたは正しいですが、x86では、最初のフィールドは「フリー」なので、「System.Object」のオーバーヘッドがなくても、最初の3つのフィールドは空いていた可能性があります:)さらに、この重要な区別のために+1してください。 –
リファレンスタイプで発生する唯一のオーバーヘッドは、タイプオブジェクトポインタの場合は4バイト、シンクブロックインデックスの場合は4バイトです。
合計で8バイトのオーバーヘッド。
オブジェクトには、それ自身のデータに加えて2つの参照/ポインタがあります。
したがって、32ビットシステムではオブジェクトは8バイト、64ビットシステムでは16バイトとなります。
訂正:
Jonが述べたように、オブジェクトの最小サイズは12バイトです。これまでに私が見つけた情報は、GCがこれを必要としていると言います。
いいえ - 何らかの理由でx86に最小オブジェクトサイズが12バイトありますが、最初のフィールドは「空き」です:) –
これに基づいてhttp://msdn.microsoft.com/en-us/magazine/cc163791 .aspx GCはオブジェクトが何らかの理由で少なくとも12バイト必要です。 – Guffa
- 1. C++クラスとオブジェクト - メモリ
- 2. メモリから破棄オブジェクト
- 3. objective-cオブジェクトのメモリ管理
- 4. C#のメモリ/オブジェクトの理解
- 5. fork()を使ったC共有メモリ
- 6. C#COMオブジェクトからprogIDを取得
- 7. mongodbからオブジェクトを取得するC#
- 8. メモリからオブジェクトを取得する方法
- 9. SAXBuilderオブジェクトをメモリから取得します
- 10. メモリに保存されたExcelテーブルから値を読み取る方法C#
- 11. C++デストラクタ:メモリが解放されたら?
- 12. オブジェクトのC#から特定のオブジェクトの値を取得
- 13. C#オブジェクトに受け取ったxmlを逆シリアル化します。
- 14. VB/C#キーパフォーマンス(メモリ)問題によるオブジェクト
- 15. C++クラス、オブジェクト、およびメモリ管理
- 16. オブジェクトにメモリを割り当てるC#
- 17. オブジェクトC静的変数メモリの質問
- 18. 目的匿名オブジェクトのCメモリ管理
- 19. ループされたオブジェクトからメモリを解放する方法
- 20. C#Word文書から読み取った
- 21. テキストファイルから読み取った値を加算する - Cプログラミング
- 22. C#範囲から受け取った相互ループループの値
- 23. C#オブジェクトからクラス
- 24. libvorbis C++のメモリからのオーディオデコード
- 25. C++ - メモリからバイナリファイルを実行
- 26. メモリからのC#ファイルのアップロード
- 27. C++でdllからインポートされた間違ったオブジェクトの検出と消去
- 28. C++を使用したオブジェクト指向設計のメモリ管理
- 29. オブジェクト-cメモリ管理と混同しました
- 30. 自己参照オブジェクトのバイナリファイルからメモリ内のリンクリストを作成するC++
良い質問。私はそれらの数百万を作成し、前と後のメモリの違いを参照して言うだろう。誰かがすでにこれをしていない限り。 –
それは私が尋ねた理由です。私は数百万のオブジェクトでアプリケーションのメモリ使用量を知る必要がありました。だから32ビットのアプリの答えは、すべてのフィールドのサイズ+8バイトです。 –