2009-05-14 5 views
3

Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Größe eines Referenztyps in C# zu finden. Ich habe etwas gegoogelt und die allgemeine Idee in den Foren scheint zu sein, dass dies nicht möglich ist. Ich dachte, ich würde euch fragen und sehen, ob jemand hier besser wüsste.C# Wie finde ich die Größe eines Referenztyps?

Schließlich müssen Profiling-Tools eine Möglichkeit haben, dies zu tun? Ich weiß, dass es nicht üblich ist, diese Information zu wissen, aber es wäre nützlich, in einigen Situationen zu haben.

+2

Ich glaube, das ist ein wirksames Duplikat von http://stackoverflow.com/questions/207592/getting-the-size-of-a-field-in-bytes-with-c#207605 –

+0

Ja stimme ich, obwohl Ich habe SO nach dieser Frage gesucht und konnte keine Ergebnisse finden (ich war überrascht, dass dies nicht bereits gestellt wurde). Ich würde sagen, dass die Frage schlecht betitelt ist, sie sollte wahrscheinlich für eine einfachere Suche optimiert sein. –

Antwort

1

überprüfen this detailed answer von Jon, werden Sie einige nützliche Informationen finden.

+0

Danke - Ich habe versucht, diese Frage zu finden! –

+0

Eigentlich ist das (in der Regel) umfassend und der oberste Absatz macht diese Frage effektiv zu einer Untermenge. Abstimmung basierend darauf schließen. – annakata

0

Eine grobe Schätzung kann gemacht werden, und die Verfolgung des verwendeten Speichers über Profilig sollte ebenfalls möglich sein. Aber das JIT hat die Freiheit, das Layout des Typs so einzurichten, wie es am besten passt, was auch von der Framework-Version, der Maschinenkonfiguration (insbesondere 32bit vs. 64bit), Framework-Provider (MS, Mono, GNU.NET etc.) abhängen kann. usw.

es im Voraus Computing wird ähnlich sein, das:

  • Referenzen sind 32-Bit oder 64-Bit-je nach Plattform

  • eine Klasseninstanz hat eine interne Referenz auf die Typinformationen (einschließlich VTable usw.), plus eine Referenz für jeden enthaltenen Referenztyp (einschließlich Strings oder Arrays) sowie den Speicher verwendet von beliebigen Strukturen (diese können so ausgelegt sein, dass der Zugriff effizient ist, tatsächlich etwas Speicher ungenutzt lässt).

Die Frage ist also auch, tun Sie den Speicher durch die Klasse oder von der Klasse verwendet, erhalten möchten und die zugehörigen Daten (wie Strings, Arrays, Listen, dictionatries usw. in Felder)?

0

Hmmm. Ich hätte gerne ein Profilierungswerkzeug verwenden, aber ich denke, so etwas wie dies funktionieren könnte:

long before = System.GC.GetTotalMemory(true); 
Foo instance = new Foo(); 
long after = System.GC.GetTotalMemory(true); 
long consumed = after - before; 
+1

Was ist der Grund für die Downvote? – user1068352

+0

Dies wird nur die Größe eines neuen leeren Objekts messen und spiegelt nicht den tatsächlichen Speicherverbrauch eines vorhandenen Objekts wider. Es kann auch ein Genauigkeitsproblem in Multithreading-Lösungen geben. – Alex