2016-04-22 7 views
2

@Zbyl Ich habe Ihre Antwort in diesem Thread (Bit fields in C#) gesehen und ich mag die Bitvector32-Methode, aber zum Zweck der Optimierung: was ist, wenn ich viele Strukturen einer Größe habe von 8 Bits/12 Bits (weniger als 32 Bits), ist es irgendwie, es in einer Weise weniger als Bitvector32 zu tun, weil das eine übertriebene Zuteilung des Gedächtnisses wäre, die nie benutzt würde: ich verwende nur die ersten 8 Bits von Bitvector32. Hier ist ein Beispiel für Struktur, die ich möchte in C# machen:von C++ nach C# // Struktur Speicher Optimierung

struct iec_qualif 
{ 
    unsigned char var :2; 
    unsigned char res :2; 
    unsigned char bl :1; // blocked/not blocked 
    unsigned char sb :1; // substituted/not substituted 
    unsigned char nt :1; // not topical/topical 
    unsigned char iv :1; // valid/invalid 
}; 
+5

Ich sehe Sie auch die Feldnamen weg optimiert. –

+0

was meinst du ?? –

+0

@DmitriBudnikov bedeutet, dass Sie sehr kurze Namen wählen .... – marom

Antwort

1

Zuerst würde ich die Anzahl der structs betrachten Sie mit wirklich tun haben. Die heutige Hardware mit GB-Speicher sollte leicht in der Lage sein, mit mehreren tausend Ihrer Strukturen fertig zu werden, auch wenn Sie drei Bytes für jede davon verschwenden (1 000 Ihrer Strukturen würde dann 4 MB potenziell> 1000 MB belegen). In diesem Sinne könnten Sie sogar ohne das Bitfeld vollständig leben und nur normale Bytes für jedes Feld haben (Ihr Setter sollte dann jedoch den Bereich überprüfen), was zu 6 statt zu vier Bytes führt (und möglicherweise zwei mehr für Ausrichtungsprobleme), Sie erhalten aber einen schnelleren Zugang zu den Werten (Getter), da kein bisschen herumhantieren notwendig ist.

Auf der anderen Seite: Bit-Felder sind am Ende nichts anderes als eine bequeme Möglichkeit, den Compiler den Code schreiben zu lassen, den Sie sonst selbst schreiben müssten. Aber mit ein wenig Übung ist es nicht eine zu schwierige Aufgabe, die Bits selbst zu behandeln, siehe this answer in dem Thema, das Sie selbst bezeichnet (der 'handmade accessors' Teil), intern alle Daten in einer Variablen des Typs byte speichern und darauf zugreifen über Bitshifting und Maskierung.