bool = 2byte
-
Hi,
belegt ein boolean wirklich 2 byte im Speicher???http://msdn.microsoft.com/en-us/library/47zceaw7(VS.71).aspx
Das ist doch doof !
-
wenn dir speicherbedarf so wichtig ist, bist du mit C#/.NET sowieso falsch beraten.
-
Da im .Net alles Klassen sind, musste ein Weg geschaffen werden auch primitive als Klassen abzubilden. Das Ergebnis sind die Boolean, Integer ... Klassen. Da es Klassen sind, sind diese natürlicherweise größer als der primitive Datentyp.
Mir stellt sich nur gerade die Frage: ist ein bool genauso groß wie ein Boolean? Laut docu ist Boolean nur ein alias für bool. Was ja bedeuten würde. Eigentlich wäre da ein trennung zwischen den primitiven und den Klassen besser wodurch wohl auch ein paar byte eingespart werden können weil die primitiven nicht von Object abgeleitet sind, dafür müsste man das Boxing besser betreiben (Also ggf konverter für Klassen anbieten) AFAIK hat MS schon sowas, wie das genau funktioniert weiß ich nicht.
-
Wenn du unbedingt nur 1 Byte willst, nimm halt die "Klasse" Byte und benutzt Convert.ToBoolean, was aber auch ein bisschen merkwürdig ist.
-
Bei bool steht:
Depends on implementing platform
-
loki1985 schrieb:
wenn dir speicherbedarf so wichtig ist, bist du mit C#/.NET sowieso falsch beraten.
Fedaykin schrieb:
Da im .Net alles Klassen sind, musste ein Weg geschaffen werden auch primitive als Klassen abzubilden. Das Ergebnis sind die Boolean, Integer ... Klassen
FreakY<3Cpp schrieb:
Wenn du unbedingt nur 1 Byte willst, nimm halt die "Klasse" Byte
Also mir gehts nicht um Speicherplatz, ich finde das Ganze nur etwas merkwürdig - ist mir halt auch jetzt erst aufgefallen.
Klar kann ich ein byte, statt eines bool nehmen; wenn aber alle (Werte-)Klassen vom Object abgeleitet sind, wie kommt es dann, dass eine 1-bit-wertige Klasse mehr Speicherplatz benötigt, als eine 8-bit-wertige?
Muss ja einen Grund haben, warum die MS/NET-Entwickler das so umgesetzt haben ...
-
Buccino schrieb:
Hi,
belegt ein boolean wirklich 2 byte im Speicher???http://msdn.microsoft.com/en-us/library/47zceaw7(VS.71).aspx
Das ist doch doof !
Wer lesen kann ist klar in Vorteil:
Visual Basic Language Reference
Data Type SummaryIn C# ist Bool 1 Byte groß. Und C# selbst hat keine Datentypen sondern nur Wrapper/Alias um die .NET CLR Typen.
-
Vielleicht weil der Aufwand zur Realisierung einer 1-bit-wertigen Klasse so hoch wäre, daß das extrem langsam wird? Da müßte man ja bei den Objekten unterscheiden, auf welchem der 64 Bits des Worts das jeweilige Objekt liegt... :o
-
Fedaykin schrieb:
Da im .Net alles Klassen sind...
Hm? Boolean ist ein struct, String auch, Int64 auch ...
Fedaykin schrieb:
Laut docu ist Boolean nur ein alias für bool
Umgekehrt wird ein Schuh draus, "bool" gibt es nicht, es gibt nur das Boolean struct.
Visual Studio "mappt" es nur für uns, damit die benutzung einfacher ist.Tipp mal in VS bool ein und schau dir den ToolTip an, oder "Go to definition"
-
CSL schrieb:
Fedaykin schrieb:
Da im .Net alles Klassen sind...
Hm? Boolean ist ein struct, String auch, Int64 auch ...
Nicht ganz. String ist eine Klasse, also ein Referenz-Typ. Allerdings bietet er keine Methoden an, welche den Inhalt direkt verändern, wodurch COW implementiert wurde.
@Fedaykin,
Es gibt grundsätzlich keine primitiven Typen in C# und .Net. Es gibt höchstens Value-Typen (struct
). Zu einer Trennung würde ich übrigens nicht raten, da muss man sich nur mal Java anschauen.Grüssli
-
Stimmt, bei String muss ich dir recht geben, hatte es anders in erinnerung
-
Zeus schrieb:
Wer lesen kann ist klar in Vorteil:
Visual Basic Language Reference
Data Type SummaryIn C# ist Bool 1 Byte groß. Und C# selbst hat keine Datentypen sondern nur Wrapper/Alias um die .NET CLR Typen.
Wenn du mir was sagen willst, sprich dich aus ...
Das Dokument verweist direkt auf die CLR (System.Boolean), die kannst du unter C# genauso explizit aufrufen.
Da der C# "bool" ein Wrapper um System.Boolean darstellt - und zusätzlich eine Nullable-Funktionalität mitbringt, müsste er imho sogar noch größer sein ...
-
Trotzdem ist das Bool 2 Byte groß in VB und in C# halt 1 Byte.
Nein Nullable muss man extra angeben wie Bool? oder Nullable<Bool>.
-
Zeus schrieb:
Trotzdem ist das Bool 2 Byte groß in VB und in C# halt 1 Byte.
Das hiesse dass Bool in C# und VB .NET auf unterschiedliche CLR/CLI Typen abgebildet würden. Halte ich erstmal bis auf weiteres für ein Gerücht (hab hier kein Visual Studio installiert, sonst würd ich es ausprobieren statt hier nur blöd mein Unglauben zu melden
)
-
hustbaer schrieb:
Zeus schrieb:
Trotzdem ist das Bool 2 Byte groß in VB und in C# halt 1 Byte.
Das hiesse dass Bool in C# und VB .NET auf unterschiedliche CLR/CLI Typen abgebildet würden. Halte ich erstmal bis auf weiteres für ein Gerücht (hab hier kein Visual Studio installiert, sonst würd ich es ausprobieren statt hier nur blöd mein Unglauben zu melden
)
http://img84.imageshack.us/i/25494137.png/
Nö.
-
Schonmal auf die Idee gekommen dass Len() in VB nicht das gleiche ist wie sizeof() in C#?
-
hustbaer schrieb:
Schonmal auf die Idee gekommen dass Len() in VB nicht das gleiche ist wie sizeof() in C#?
Hast du ne andere Funktion im Sinn?
Mit andere Ganzahl-Datentypen stimmt die norminale Größe mit den von sizeof() in c# überein.
Außerdem darfst du mich gerne belehren weiter belehren:
Returns an integer containing either the number of characters in a string or the nominal number of bytes required to store a variable.
The sizeof operator is used to obtain the size in bytes for a value type.
-
Bei Mono kommt für bool auch 2 raus (Zeile 10), aber das bedeutet ja nicht, dass der Typ tatsächlich 2 Bytes groß ist, oder?
Public Shared Function Len(ByVal Expression As Boolean) As Integer Return GetSize(Expression) End Function
Private Shared Function GetSize(ByVal Expression As Object) As Integer If Expression Is Nothing Then Return 0 End If Dim Tcode As TypeCode = Type.GetTypeCode(Expression.GetType()) Select Case Tcode Case TypeCode.Boolean Return 2 Case TypeCode.Byte Return 1 Case TypeCode.Char Return 2 Case TypeCode.DateTime Return 8 Case TypeCode.DBNull Throw New InvalidCastException Case TypeCode.Decimal Return 8 Case TypeCode.Double Return 8 Case TypeCode.Empty Return 0 Case TypeCode.Int16 Return 2 Case TypeCode.Int32 Return 4 Case TypeCode.Int64 Return 8 Case TypeCode.Object Throw New InvalidCastException Case TypeCode.SByte Return 1 Case TypeCode.Single Return 4 Case TypeCode.String Return Conversions.ToString(Expression).Length Case TypeCode.UInt16 Return 2 Case TypeCode.UInt32 Return 4 Case TypeCode.UInt64 Return 8 End Select End Function
-
Ist doch egal was bei VB rauskommt, Zeus hat gezeigt das bei C# Boolean = 1 Byte groß ist.
-
@Zeus:
Wenn du die Doku zu "Len()" genau liest, wirst du feststellen, dass da irgendwas von schreiben in irgendwelche Files steht. Also Serialisierung. Das hat wenig damit zu tun wie gross der Typ im Speicher ist.Auf jeden Fall muss ein Bool in C# und VB gleich gross sein, denn es ist schliesslich der gleiche CLR/CLI Typ.
Interop zwischen VB und C# wäre sonst nicht wirklich möglich.