Wenn ich drei verschiedene Werte haben, die alle passen in 32 Bits könnte, macht es Sinn, einen uint zu verwenden, um sie zu speichern?
-
01-10-2019 - |
Frage
Was ich meine ist, sage ich ein struct
haben einige Daten zu repräsentieren, und es sieht wie folgt aus:
struct LilStruct
{
public readonly short A;
public readonly byte B;
public readonly byte C;
public LilStruct(short a, byte b, byte c)
{
A = a;
B = b;
C = c;
}
}
Ein short
und zwei byte
Werte könnten alle passen in 32 Bit. Was ich frage mich, ist (für Zwecke der Ausrichtung, Leistung, was auch immer), wenn es tatsächlich Sinn machen würde, diese Daten in folgendem Format zu speichern, statt:
struct LilStruct
{
private readonly uint _value;
public LilStruct(short a, byte b, byte c)
{
_value = ((uint)a << 16) | ((uint)b << 8) | (uint)c;
}
public int A
{
get { return (int)(_value >> 16); }
}
public int B
{
get { return (int)(_value >> 8) & 0x000000FF; }
}
public int C
{
get { return (int)(_value & 0x000000FF); }
}
}
Ist das sinnlos? Was wären die Vorteile / Nachteile sein?
Lösung
In .NET, wenn Sie eine struct
sowieso verwenden wollen, können Sie als dekorieren und die Struktur mit StructLayoutAttribute
wie folgt aus:
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct LilStruct
{
public readonly short A;
public readonly byte B;
public readonly byte C;
public LilStruct(short a, byte b, byte c)
{
A = a;
B = b;
C = c;
}
}
Dies wird den Effekt haben, dass die Felder sequentiell angelegt, z.B. Feld B
wird bei Offset 16 beginnen.
Ein Wert von 1 für Pack
bedeutet, dass die Felder an den byte
Grenzen ausgerichtet sind.
Andere Tipps
Sie sollten nur mehrere Werte in eine uint betrachten pauken, wenn die Werte eng miteinander verbunden sind, in der Regel um zusammen geführt und sind nie oder sehr selten unabhängig voneinander bearbeitet. Die Kosten für das Auspacken und Verpacken des uint, um seinen Wert zu ändern, machen diese sehr teuer (in Codegrße und die Ausführungszeit) im Vergleich zu nur drei Bytes separat zu speichern.
Wenn mit insgesamt 10k Byte RAM auf einer Mikroeinrichtung ausgeführt wird, wie diese Verpackung wert sein könnte, weil der Speicher kostbarer als die Ausführungsgeschwindigkeit ist. An einem normalen Desktop-PC oder sogar Handy-Gerät, ist diese Verpackung wahrscheinlich nicht die Mühe wert.
Sie könnten mit Ihrer struct Definition bleiben, und wenden Sie die StructLayout Attribut mit einem
Was Sie begegnen, ist ein einfacher Kompromiss zwischen der Größe der In-Memory-Datenobjekte und die Kosten der Verarbeitung. Wenn der Speicher ein echtes Anliegen ist, kann es einfach billiger sein, mehr RAM auf Ihrem Rechner zu werfen.
Es gibt einige Fälle, in denen es zu stopfen Sachen in eine ganze Zahl sich lohnt. Speicherplatz allein ist in der Regel nicht ein guter Grund, aber wenn die Werte gehen, um zusammen verwendet werden, wie z.B. ein Schlüssel für einen Wörterbuch, ein Dictionary (Of Integer, was auch immer) wird viel schneller als ein Dictionary (Of SomeStructure, was auch immer).
sein