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?

StackOverflow https://stackoverflow.com/questions/3587593

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?

War es hilfreich?

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.

scroll top