2014-11-05 6 views

Antwort

1

Beide haben dieselbe Größe, da Strukturen wie jeder andere Werttyp behandelt und im Heap zugewiesen werden.

long startMemorySize2 = GC.GetTotalMemory(true); 
var MatrixOfCells = new Cell[1000, 1000]; 
long matrixOfCellSize = GC.GetTotalMemory(true); 

long startMemorySize = GC.GetTotalMemory(true); 
var MatrixOfInts = new int[1000, 1000]; 
long matrixOfIntSize = GC.GetTotalMemory(true); 

Console.WriteLine("Int Matrix Size:{0}. Cell Matrix Size:{1}", 
    matrixOfIntSize - startMemorySize, matrixOfCellSize - startMemorySize2); 

Hier ist ein Spaß von Jeffery Richter liest, wie Arrays zugeordnet sind http://msdn.microsoft.com/en-us/magazine/cc301755.aspx

+0

Nichts besser als Beweise, mit seiner replizierbaren Extraktionsmethode. Vielen Dank! –

1

den sizeof Operator in C# und Ausführen des folgenden Code Durch die Verwendung von (unter Mono 3.10.0) Ich nehme die folgenden Ergebnisse erhalten:

struct Cell 
    { 
     int Value; 
    } 

    public static void Main(string[] args) 
    { 
     unsafe 
     { 
      // result is: 4 
      var intSize = sizeof(int); 
      // result is: 4 
      var structSize = sizeof(Cell); 
     } 
    } 

So wie es aussieht, dass eine ganze Zahl und eine Struktur zu speichern eine ganze Zahl verbrauchen Bei gleicher Speichermenge würde ich daher davon ausgehen, dass auch Arrays eine gleiche Speichermenge benötigen.

+0

Interessant, aber das Array würde eine Art Information pro Zelle enthalten ?. Beachten Sie, dass eine Struktur eine Schnittstelle implementieren kann, so dass wir ... var Matrix = IMyStruct [100,100]; (Wenn die Zellenstruktur die IMyStruct-Schnittstelle implementiert), dann speichert die CLR möglicherweise Informationen darüber, welcher Implementierer pro Zelle zugewiesen ist. –

+0

Hmm, das ist eine interessante Frage, aber ich denke, in dem Fall, dass Sie Ihre Strukturen als Schnittstellen speichern, würde Boxen auftreten, die den Speicherverbrauch erhöhen würde, da Ihre Strukturen dann zu Referenztypen konvertiert würden? Falls Sie Ihre Strukturen einfach mit ihrem Werttyp (wie in Ihrer Frage beschrieben) speichern, müssen keine zusätzlichen Typinformationen gespeichert werden. – pgenfer

+0

Unser Wissen ist begrenzt. Ich hoffe, dass jemand, der sich mit diesen Fragen auf niedrigem Niveau auskennt, wie Eric Lippert oder Jon Skeet, es beantworten könnte. –

1

In einem Array mit Elementen vom Typ value müssen alle Elemente vom gleichen Typ sein. Das Objekt, das das Array enthält, muss Informationen über den Typ der darin enthaltenen Elemente speichern, aber diese Informationen werden nur einmal pro Array gespeichert und nicht einmal pro Element.

Beachten Sie, dass Arrays, die eine spezielle Behandlung im .NET Framework erhalten (verglichen mit anderen Auflistungstypen) Arrays eines Strukturtyps ermöglichen, dass Elemente der darin enthaltenen Strukturen "direkt" verarbeitet werden. Wenn man sich darauf beschränken kann, eine Struktur innerhalb eines Arrays zu speichern (anstatt eines anderen Sammlungstyps) und das unnötige Kopieren von Strukturinstanzen minimieren kann, ist es folglich möglich, effizient mit Strukturen nahezu jeder Größe zu arbeiten. Wenn man eine Sammlung von Dingen halten muss, von denen jeder vier Werte von Int64 und vier Werte von Int32 (insgesamt 48 Bytes) zugeordnet hat, kann die Verwendung eines Arrays aus acht Elementen mit exponierten Feldstrukturen effizienter und semantischer sein sauberer als jede Sache mit vier Elementen aus einer Int64[] und vier Elemente aus einer Int32[], oder mit einem Array von Referenzen auf nicht gemeinsam genutzte veränderbare Klassenobjekte.

+0

Das Array muss nicht einmal den Typ der Elemente speichern, da dies in einem eigenen Typ enthalten ist. True für alle Arten von Arrays: Wert, Referenz, Schnittstelle usw.Bei Arrays aus Referenz- und Schnittstellentypen hat das Array natürlich nur Handles zu den tatsächlichen Elementen, und die Elemente selbst speichern ihre eigenen individuellen Typen. –

+0

@BenVoigt: Ich dachte, ich habe irgendwo gelesen, dass das "type" -Feld im Objektkopf eines Arrays es nur als ein Array identifiziert und dass der Elementtyp als Teil des Array-Objekts selbst gespeichert wurde. In jedem Fall würde ein Array-Objekt sicherlich Informationen speichern, die ausreichen, um den Typ der Elemente zu identifizieren, sei es durch Speichern des Elementtyps getrennt von seinem eigenen oder durch ein getrenntes "Type" -Objekt, das für jede Kombination von Array deklariert ist Dimensionalität und Elementtyp und jedes Array speichert einen Verweis darauf. – supercat

+0

Einverstanden. Ich sage nur, dass dies nicht nur für Arrays vom Werttyp ist, die homogen sind. Arrays polymorpher Typen haben immer noch nur einen gemeinsamen Elementtyp, und die verschiedenen Arten von Elementen werden aus dem Objektkopf jedes Elements nachgeschlagen. –

Verwandte Themen