für die Transpositionstabelle (in der Regel eine Hash-Tabelle) eines Connect Four Spiel, würde ich gerne den Speicher effizient nutzen (um die meisten möglichen Anzahl der Elemente zu speichern). Ein Tabellenelement hat speichern folgende Informationen:Wie kann die Speicherauslastung eines Strukturtyps minimiert werden?
- lock: unsigned 64-Bit-
- bewegen: [0..6] -> unsigned 3 Bit
- Punktzahl: [-2000..2000] - -> signierten 12-Bit-
- flag: VALID, UBOUND, LBOUND: -> unsigned 2 Bit
- Höhe: [-1..42]: -> signierten 7 Bit
Zuerst habe ich versucht folgende Datenstruktur, die 24 Bytes benötigt:
struct TableEntry1
{
unsigned __int64 lock;
unsigned char move;
short score;
enum { VALID, UBOUND, LBOUND } flag;
char height;
};
Nachdem die Elemente neu anordnen es 16 Bytes benötigt (fand ich die answer für dieses Verhalten):
struct TableEntry3
{
unsigned __int64 lock;
unsigned int move:3;
int score:12;
enum { VALID, UBOUND, LBOUND } flag:2;
int height:7;
};
Welche 16 Bytes benötigt auch:
struct TableEntry2
{
unsigned __int64 lock;
enum { VALID, UBOUND, LBOUND } flag;
short score;
char height;
unsigned char move;
};
Mein letzter Versuch war . Ist es möglich, die Struktur so zu ändern, dass sie nur 12 Bytes verwendet (auf einer 32-Bit-Architektur)? Warum macht der Compiler nicht meinen letzten Versuch 12 Bytes lang?
Danke!
Bearbeiten Die Eigenschaft lock
ist eine eindeutige Element-ID zum Erkennen von Hash-Kollisionen.
Für eine Transpositionstabelle wäre es nicht sinnvoller, die Geschwindigkeit über die Speichereffizienz zu schätzen. Speichern Sie die Strukturen nicht richtig, anstatt die letzten 4 Byte zu speichern. Es würde meiner Einschätzung nach zu einer insgesamt besseren Leistung führen. –
@TommyA: Je mehr Connect-Four-Game-Repräsentationen innerhalb der Transponiertabelle verfügbar sind, desto weniger Game-Representations müssen ausgewertet werden. Bewertung ist teurer. –
Für beste Verpackung und beste Leistung ohne Optimierung. Listen Sie die Mitglieder in der Reihenfolge ihrer Größe auf. Vom Größten zum Kleinsten. Der Compiler fügt dann den niedrigsten Peak hinzu. (Faustregel). –