Wie erstellt C # eine Instanz einer Klasse?

9
%Vor%

Sie möchten erfahren, wie eine Instanz einer Klasse im Hintergrund erstellt wird. Wenn diese Aussage

%Vor%

wird ausgewertet. Was wird im Hintergrund passieren? Meine folgenden Aussagen sind korrekt oder nicht (für 32-Bit-Betriebssystem)?

  1. Ein Speicherbereich wird erstellt und als myClass ;
  2. referenziert
  3. Innerhalb des obigen Speicherplatzes werden 4 Bytes für den Wert von int i ;
  4. verwendet
  5. Innerhalb des obigen Speicherplatzes werden 4 Bytes für die Referenz von string str ; Der tatsächliche Wert von str wird an einem anderen Ort gespeichert (wo?)
  6. innerhalb des obigen Speicherplatzes werden 8 Bytes für den Wert von MyStruct mystruct verwendet (weil MyStruct 8 Bytes ist);
  7. Innerhalb des obigen Speicherplatzes werden 4 Bytes für die Referenz des B b -Objekts verwendet; Speicher für b-Objekt wird an anderer Stelle zugewiesen, wenn es instanziiert wird;
  8. Innerhalb des obigen Speicherplatzes werden 4 Bytes für die Referenz von ArrayList myList verwendet; Der tatsächliche Speicherplatz für ArrayList myList wird an anderer Stelle zugewiesen und hier als myList ;
  9. referenziert
  10. weitere 4 oder 8 Bytes aus dem obigen Speicherplatz werden für Objektmetadaten verwendet;
  11. ...;
5YrsLaterDBA 30.07.2010, 16:06
quelle

3 Antworten

2

Sie haben die Grundidee vor Ort. Die tatsächlichen Einzelheiten, abgesehen von dem, was Sie einschließen, sind implementierungsspezifisch. Für ein paar Ihrer Punkte:

3) Die tatsächliche Zeichenfolge wird normalerweise wie jede andere Klasse in ihrem eigenen Speicherbereich gespeichert. Da Sie in diesem Fall jedoch ein Zeichenfolgenliteral verwenden, befindet es sich höchstwahrscheinlich im String-internen Pool, der (glaube ich) im Heap des großen Objekts gespeichert ist. Weitere Informationen zum String-Interning finden Sie unter String.Intern . (Wenn Sie die Zeichenfolge im Handumdrehen zugewiesen haben, wird die Zeichenfolge anstelle eines Literals im normalen verwalteten Heap Ihrer Anwendung gespeichert.)

    
Reed Copsey 30.07.2010, 16:11
quelle
1

Das ist es.

Der String wird in der String-Tabelle gespeichert und nicht als frei fließendes Objekt im Heap. Es ist wichtig zu beachten, dass nur eine Instanz dieser Zeichenfolge instanziiert wird, unabhängig von der Anzahl der Instanzen von MyClass , die instanziiert werden.

    
Randolpho 30.07.2010 16:10
quelle
1
  

7.weitere 4 oder 8 Bytes aus dem obigen Speicherplatz werden für das Objekt verwendet   Metadaten

Es wäre 8 Bytes. 4 für den Syncblock und 4 für Typinformationen.

Weitere Informationen zum Thema finden Sie in dieser Frage .

>     
Brian Gideon 30.07.2010 16:35
quelle

Tags und Links