bool = 2byte
-
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
-
GPC schrieb:
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.
Bedeutet das jetzt, dass CLR-intern generell immer 4 byte ver(sch)wendet werden, oder nur sobald ein interop im Spiel ist?
-
GPC schrieb:
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.
Marshal.SizeOf ist was das angeht auch relativ uninteressant, da es dabei ja um Interop managed/unmanaged geht. Dass für unmanaged Code 4 Byte verwendet werden wundert mich auch nicht sehr, da die ganze WinAPI mit 4 Byte grossen Bools arbeitet.
----
Wenn wir mal als gegeben annehmen dass ein Bool in C# 1 Byte gross ist, dann muss ein Bool in VB auch 1 Byte gross sein, da zwischen C# und VB kein Marshaling stattfindet.
-
Wollen wir der Sache mal auf den Grund gehen.
- Wieso gibt Marshal.SizeOf 4 zurück?
Hustbear hat das schon richtig erkannt. Es geht dabei um das Default-Marshaling Verhalten bei System.Boolean und dieses richtet sich nach der WinAPI. Man kann daher einem Parameter auch MarshalAs Attribute geben, damit zum Beispiel wirklich nur 1 Byte draus gemacht wird. Alles weitere hier nachzulesen:
http://msdn.microsoft.com/en-us/library/ac7ay120.aspx
http://msdn.microsoft.com/en-us/library/t2t3725f.aspx - Welche Grösse hat System.Boolean in C#?
Kann man in folgendem Link nachlesen. Da steht übrigens auch nochmals eine Antwort zu Marshal.SizeOf drin (unterhalb der Tabelle).
http://msdn.microsoft.com/en-us/library/eahchzkf.aspx - Wieso gibt Len in VB 2 zurück?
Len gibt die Länge zurück, welche beim Speichern verwendet wird, also zum Beispiel in ein File. Visual Basic .Net soll rückwärtskompatibel sein und früher wurde in VB für Bool ein 16 Bit Integer verwendet. Daher nehme ich an, speichert man aus Rückwärtskompatibilität immer noch 16 Bit Integers.
http://msdn.microsoft.com/en-us/library/dxsw58z6.aspx
Hier ein Hinweis, dass der Boolean Type in Visual Basic verschiedene Grössen haben kann, je nach Platform (wahrscheinlich wird da mit .Net oder ohne gemeint).
http://msdn.microsoft.com/en-us/library/47zceaw7.aspxHier noch ein Link aus alten Zeiten, welcher ein paar Interessante Informationen hat:
http://msdn.microsoft.com/en-us/library/wts33hb3(v=VS.71).aspxIn VB kommt es meiner Meinung nach also ganz darauf an, welcher Datentyp jetzt wirklich verwendet wird. Ist es System.Boolean aus .Net, dann ist die Grösse 1 Byte, wenn es den Boolean Type aus VB ist, dann sind es 2 Bytes.
Grüssli
- Wieso gibt Marshal.SizeOf 4 zurück?
-
Buccino schrieb:
GPC schrieb:
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.
Bedeutet das jetzt, dass CLR-intern generell immer 4 byte ver(sch)wendet werden, oder nur sobald ein interop im Spiel ist?
Letzteres. CLR-intern ist es idR 1 byte, aber es können auch auch zwei bytes sein, z.B. wenn man Nullable<bool> nutzt.