3 Stimmen

Nützlichkeit von bool* in C#

Kann ich bool* auf irgendeine sinnvolle Weise verwenden? Wie könnte ich beispielsweise bool* in ein byte umwandeln oder bool* in einem Byte speichern?

Mein Ziel ist es, meinen eigenen Speicher in einem meiner Projekte zu verwalten, die Details sind nicht wichtig, nur etwas, das ich gerne tun möchte. Nun möchte ich meine eigenen Variablen speichern können, und ich brauche zufällig einen booleschen Wert zu speichern. Wie kann ich, unter Verwendung von unsafe und einem byte*, diesen booleschen Wert speichern und meinen Speicher optimal nutzen? Ideal wäre es, 4 Bits im Byte zu speichern.

4voto

Abel Punkte 53946

In C# würden Sie normalerweise kein bool* verwenden, was etwas ist, das Sie nur in unsicherem Code verwenden können (was viele andere Dinge wie das Anheften von Objekten und so weiter mit sich bringt). Ein bool* wäre ein Zeiger auf einen bool'schen Wert. Ein Zeiger ist 4 Bytes lang und kann nicht ohne Verlust in ein Byte umgewandelt werden.

Warum möchten Sie das tun und wo begegnen Sie dem? Normalerweise gibt es nicht leicht einen Anwendungsfall für die Verwendung von Zeigern in C#, es sei denn, Sie haben eine sehr spezifische Anforderung (d. h. einen API-Aufruf, den Sie jedoch mit P/Invoke lösen können).

BEARBEITEN: (weil Sie Ihre Frage bearbeitet haben.)

Der folgende Code-Schnipsel zeigt Ihnen, wie Sie die Adresse einer booleschen Variablen erhalten und wie Sie diesen Zeiger in ein int umwandeln (eine Umwandlung in byte ist nicht möglich, wir benötigen vier Bytes).

unsafe
{
    // Zeiger auf booleschen Wert erhalten
    bool* boolptr = &mybool;                

    // den int-Zeiger erhalten (jedoch nicht notwendig, erleichtert aber das Folgende)
    int* intptr = (int*)boolptr;

    // den Wert erhalten, auf den der Zeiger zeigt
    int myint = *intptr;

    // die Adresse als normale Ganzzahl erhalten
    int myptraddress = (int) intptr;
}

Sie sagen "idealwerweise 4 Bits in einem Byte speichern". Falls Sie keine 4-Bits-Maschinenarchitektur haben, rate ich dringend davon ab, da das Abrufen und Speichern der booleschen Werte sehr langsam werden würde. Aber noch wichtiger: Sie sprechen hier von C#, nicht von C++. C# ist an die CLR gebunden, die besagt, dass ein boolean als Byte gespeichert wird und dass jede Speicheradresse in 32-Bit-Architekturen vier Bytes lang ist, was bedeutet, dass Zeiger vier Bytes lang sind. Daher kann Ihre Frage, die Umwandlung eines bool* (Zeiger auf einen bool'schen Wert) in etwas anderes, nur in einen Integer oder einen anderen Datentyp, der vier Bytes breit ist, umgewandelt werden.

Ein Tipp: Mit Flags können Sie den Speicherplatz optimal nutzen: Auf diese Weise verwenden Enum-Typen für jedes Flag ein Bit, was Ihnen acht boolesche Werte für jedes Byte gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X