In den letzten Tagen war ich auf der Suche nach einer Lösung für das Boolean Problem und habe nun eine recht gute gefunden.
Erst einmal möchte ich noch ein Beispiel für die standard Größe zeigen:
1 2 3 4 | struct testStruct { bool bool1, bool2, bool3, bool4, bool5, bool6, bool7, bool8, bool9, bool10; } |
struct testStruct
{
bool bool1, bool2, bool3, bool4, bool5, bool6, bool7, bool8, bool9, bool10;
}Wenn wir das Ganze mit Marshal.SizeOf ausgeben lassen, erhalten wir 40 bytes.
Nun hatte ich mich an die StructLayout-Möglichkeiten erinnert und ausprobiert, was es noch gibt. Für das Wrappen von Typen in Unmanaged Typen gibt es ein Attribut, names “MarshalAs”, mit der Eigenschaft “UnmanagedType”. Das ist auch schon eine mögliche Lösung. Wir fügen in einem Struct einfach das Attribut zu den boolean Variablen hinzu und geben als UnmanagedType “I1″ an.
1 2 3 4 5 | struct testStruct { [MarshalAs(UnmanagedType.I1)] bool bool1, bool2, bool3, bool4, bool5, bool6, bool7, bool8, bool9, bool10; } |
struct testStruct
{
[MarshalAs(UnmanagedType.I1)]
bool bool1, bool2, bool3, bool4, bool5, bool6, bool7, bool8, bool9, bool10;
}Wenn wir das ganze nun wieder überprüfen, erhalten wir 10. Demnach hat nun jeder boolean ein einzelnes Byte, so wie wir uns das gewünscht hatten.
Nun hat man aber nicht immer ein Struct in welchem wir booleans benutzen und das Attribut reicht in Klassen nicht allein. Damit das Ganze auch für Klassen funktioniert, müssen wir der Klasse das “StructLayout” Attribut anfügen und als “LayoutKind” “Sequential” wählen.
So kann man nun seine Structs auch wieder Speichereffizienter nutzen