Autor Beitrag
gitta
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Di 26.07.05 17:28 
Hallo Zusammen,

ich habe etwas sehr wichtiges noch nicht kappiert:
Wenn ich in Delphi ein Integer verwende, werden 4Byte
Speicher verbraten. Wenn in C# nun ein Integer ein
Objekt ist mit jede Menge Methoden, wie viell Speicher wird
dafür verwendet?
Oder ist es so zu verstehen das der Compiler so Inteligent
ist, das alle Methoden u.s.w. eines jeden Objektes entfernt werden
wenn diese in der Anwendung keine Verwendung finden.?

Gruß Gitta


Moderiert von user profile iconraziel: Topic aus .NET verschoben am Sa 17.09.2005 um 22:11
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 26.07.05 18:45 
ich meine in java ist es das selbe, es macht nen unterschied ob man einen integer oder einen int hat

integer = zahl
int = objekt

wie der compiler das aber optimiert kann ich dir nicht sagen

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Di 26.07.05 18:57 
Bei .NET gibt es keine primitiven Typen wie bei Java, auch der simpelste Integer ist ein Objekt.

Aber: Der Compiler erkennt die Fälle, in denen keine Methoden der Objekte verwendet werden. In diesem Fall werden die Variablen als primitive Typen behandelt, es entsteht also kein Overhead. Erst wenn diese Variablen wirklich als Objekte verwendet werden, werden sie auch als Objekte behandelt und auf dem Heap abgelegt.


Das habe ich zumindest mal gelesen, bin mir aber nicht mehr sicher, wo, deshalb ist das ganze ohne Gewähr.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 26.07.05 19:09 
Es ist ungefähr so wie UC-Chewie das schon erklärt hat.. Das ganze nennt sich Boxing bzw Unboxing. Eine Boxingkonvertierung ermöglicht die implizite Konvertierung eines Werttyps in einen Verweistyp. Folgende Boxingkonvertierungen gibt es:
  • Aus jedem Werttyp (einschließlich aller Enumerationstypen) in den Typ object
  • Aus jedem Werttyp (einschließlich aller Enumerationstypen) in den Typ System.ValueType
  • Aus jedem Werttyp in jeden Schnittstellentyp, der durch den Wert implementiert wird.
  • Aus jedem Enumerationstyp in den Typ System.Enum

Das Boxing des Wertes eines Werttyps besteht aus dem Anlegen einer Objektinstanz und dem Kopieren des Werts des Werttyps in diese Instanz.
Eine Unboxingkonvertierung ermöglicht die explizite Konvertierung eines Verweistyps in einen Werttyp. Folgende Unboxingkonvertierungen gibt es:
  • Aus dem Typ object in jeden Werttyp (einschließlich aller Enumerationstypen)
  • Aus dem Typ System.ValueType in jeden Werttyp (einschließlich aller Enumerationstypen)
  • Aus jedem Schnittstellentyp in jeden Werttyp, der den Schnittstellentyp implementiert.
  • Aus dem Typ System.Enum in jeden Enumerationstyp.

Bei einer Unboxingoperation wird zuerst überprüft, ob die Objektinstanz ein mittels Boxing gepackter Wert des Werttyps ist, und anschließend wird der Wert aus der Instanz kopiert.

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
gitta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Mi 27.07.05 11:22 
Hallo Motzi,

danke für die ausführliche Antwort.
Das Boxing-/UnBoxing passiert das automatisch oder muss ich selbst machen?
Wenn von Hand, wie sieht das aus? Kannst Du mir bitte ein Beispiel
geben?

Danke schon mal.

Gruß Gitta
Marauder
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72



BeitragVerfasst: Mi 17.08.05 02:50 
hä?

Leutz!

Alle ordinalen und andere Datentypen in .net sind Objekte. ALLE!
Darum kümmert sich die CTS (Common Type System).

Es gibt Valuetypes (Wertetypen) und Referencetypes (Referenztypen)

Referencetypes (Objekte) werden im Heap gespeichert, weil deren Größe sich ändern kann.
Valuetypes in einer eigenen Datenstruktur, weil Sie eine feste Größe haben.
(allocated inline structure)
Aus Gründen der Effinzienz und Geschwindigkeit werden Valuetype-Objekte anders behandelt
als normale Objekte. Wenn ValueTypes intern als "normale" Objekte gespeichert werden müssen, zum Beispiel
wenn eine Collection einen System.Object benötigt, kommt das Boxing zum Einsatz.
Zum Boxing wird ein gewisser Speicherbereich im Heap reserviert und das komplette Teil wird dorthin
kopiert und gilt fortan als normales Objekt.

Wenn das ganze umgekehrt abläuft nenn man das unboxing.
Marauder
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 72



BeitragVerfasst: Mi 17.08.05 23:46 
Boxing kann implizit oder explizit erfolgen:

Implizit in Delphi:
ausblenden Delphi-Quelltext
1:
2:
collection.object := a   // a stellt eine Variable vom ordinalen 
                         // Typ Integer dar

Müsste in C# gleich sein.

Explizit in Delphi:
ausblenden Delphi-Quelltext
1:
oObject := System.Object (a) // a wieder Ordinaltyp Integer					

umgekehrt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var oObject : tObject;
    bBool   : Boolean;

bBool := True;
oObject := bBool;

x := Boolean (oObject) // unboxing