.net Objektgröße padding?

9

msdn sagt das

  

Der Operator sizeof kann nur in unsicheren Codeblöcken verwendet werden. Obwohl   Sie können die Marshal.SizeOf-Methode verwenden, den Wert, der von diesem zurückgegeben wird   Methode ist nicht immer der gleiche wie der von sizeof zurückgegebene Wert.

und

  

Marshal.SizeOf gibt die Größe zurück, nachdem der Typ gemarshallt wurde.   während sizeof die Größe zurückgibt, wie sie vom common zugewiesen wurde   Sprachlaufzeit, einschließlich ** ** Padding **.

einmal im Buch lesen: c # über clr (Seite 522)

das:

Fragen:

1) macht das Padding hier:

ist das selbe wie im Buch erwähnt?

AND

2) Wenn ich den Objekttyp Person habe - wie kann ich seine TRUE SIZE in MEMORY kennen?

edit - warum brauche ich das?

Bitte beachten Sie dies :

sie haben eine Probe von Leseaufzeichnungen:

%Vor%

Wenn die von MARSHAL.sizeOF gemeldete Größe nicht ist, die Größe als sizeOF also - welche soll ich wählen? es muss stimmen !!

Nach diesem Beispiel betrachten sie das Padding nicht, und sie sollten ... (oder nicht ...)

    
Royi Namir 15.05.2012, 14:00
quelle

2 Antworten

5

Das mag unaufrichtig erscheinen - aber die Größe, die Sie aus der Sicht der Memory-Mapped-Datei interessieren, ist nicht dasselbe wie die Größe des Objekts im Speicher. Sie werden zwar als Memory-Mapped-Dateien bezeichnet, aber in .Net bedeutet das nicht unbedingt ganz dasselbe wie in nativem Code. (Die zugrunde liegende Implementierung ist jedoch immer noch dieselbe - ein Abschnitt des logischen Speichers ist einem Abschnitt einer Datei zugeordnet, daher ist der Name immer noch korrekt)

sizeof gibt die korrekte Größe des Objekts im physischen Speicher zurück, einschließlich etwaiger Füllbytes usw. Wenn Sie also die genaue Größe eines Objekts im nativen Speicher kennen müssen, verwenden Sie das (aber dieses doesn 't gilt für Memory-Mapped-Dateien, wie ich gleich erklären werde.

Wie in der Dokumentation angegeben, meldet Marshal.SizeOf die Größe eines Objekts aus der Sicht von .Net, mit Ausnahme der zwei ausgeblendeten Datenelemente. die nur von der Laufzeit verwendet werden.

Das Beispiel, das Sie kopiert haben, verwendet Marshal.SizeOf , da die Füllwerte nur auf das physische Objekt im Speicher bezogen sind. Wenn das Objekt serialisiert wird, werden nur die logischen .Net-Daten serialisiert. Wenn das Objekt erneut geladen wird, werden diese zwei aufgefüllten Werte basierend auf dem Status der Laufzeit an diesem Punkt neu zugewiesen. Z.B. Der Typzeiger könnte anders sein. Es wäre sinnlos, sie zu serialisieren. Es wäre so, als würde man einen nativen Zeiger (nicht einen Offset) auf die Festplatte serialisieren - es ist unglaublich unwahrscheinlich, dass die Daten, auf die er zeigt, beim nächsten Mal an der gleichen Stelle sind.

Ergo - wenn Sie wissen möchten, wie viel ein Array von 100 Color Objekten im physischen Speicher verwendet - verwenden Sie sizeof ; Wenn Sie wissen möchten, wie groß die memroy-mapped Datei für die gleichen Daten wäre, verwenden Sie Marshal.SizeOf .

    
Andras Zoltan 15.05.2012, 14:20
quelle
0

sizeof wird verwendet, um die Größe eines festen Elements (Primzahlen und Strukturen) zu bestimmen, während Marshal.SizeOf die Größe eines Objekts zur Laufzeit basierend auf der Größe des zugewiesenen Speichers (Klassen)

bestimmt     
Cole Johnson 15.05.2012 14:15
quelle

Tags und Links