bool = 2byte
-
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.
-
hustbaer schrieb:
@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.So ist es. Und wenn man die richtigen Methoden zur Größenbestimmung benutzt, dann zeigt sich das auch
Anmerkung: Marshal.SizeOf liefert die unmanaged Größe in Bytes.
C#-Code:
Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(typeof(bool)));
Ergebnis: 4
VB-Code:
Sub Main Dim b as boolean Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(b)) End Sub
Ergebnis: 4
4 bytes für etwas, dass man auch in 1 bit ablegen kann? Der Grund dafür liegt am memory alignment und darin, dass der GC leichter 4 bytes durch die Gegend schieben kann als 1 bit.
Wenn man relativ viele bools hat, kann man die in einem BitVector32 ablegen.Als managed type hat bool in C# aber tatsächlich nur 1 byte (zeigt sich auch an sizeof(bool)). Beim Marshalling wird ein bool dann auf 4 byte erweitert.
-
So ein Unsinn
-
Zeus schrieb:
So ein Unsinn
Du darfst deine Argumentation natürlich gerne auch untermauern
Z.B. wieso denn die bool-typen von C# und VB.NET intern nicht auf den gleichen CLR-Datentyp mappen sollten
-
GPC schrieb:
Zeus schrieb:
So ein Unsinn
Du darfst deine Argumentation natürlich gerne auch untermauern
Z.B. wieso denn die bool-typen von C# und VB.NET intern nicht auf den gleichen CLR-Datentyp mappen solltenDamit hab ich die Microsoft Entwickler gewürdigt
-
Zeus schrieb:
GPC schrieb:
Zeus schrieb:
So ein Unsinn
Du darfst deine Argumentation natürlich gerne auch untermauern
Z.B. wieso denn die bool-typen von C# und VB.NET intern nicht auf den gleichen CLR-Datentyp mappen solltenDamit hab ich die Microsoft Entwickler gewürdigt
War mir nicht ersichtlich