для таблицы транспонирования (обычно хеш-таблицы) игры Connect Four, я хотел бы эффективно использовать память (для хранения максимально возможного количества элементов).Один элемент таблицы должен хранить следующую информацию:
- блокировка: 64-битный без знака
- перемещение: [0..6] -> 3-битный без знака
- счет: [-2000..2000] -> подписанный 12-битный
- флаг: VALID, UBOUND, LBOUND: -> беззнаковый 2-битный
- высота: [-1..42]:-> подписанный 7 бит
Сначала я попробовал следующую структуру данных, для которой требуется 24 байта:
struct TableEntry1
{
unsigned __int64 lock;
unsigned char move;
short score;
enum { VALID, UBOUND, LBOUND } flag;
char height;
};
После перестановки элементов требуется 16 байтов (я обнаружил ответ за это поведение):
struct TableEntry2
{
unsigned __int64 lock;
enum { VALID, UBOUND, LBOUND } flag;
short score;
char height;
unsigned char move;
};
Моя последняя попытка была:
struct TableEntry3
{
unsigned __int64 lock;
unsigned int move:3;
int score:12;
enum { VALID, UBOUND, LBOUND } flag:2;
int height:7;
};
Для чего также необходимо 16 байтов.Можно ли изменить структуру так, чтобы она использовала только 12 байтов (на 32-битной архитектуре)?Почему компилятор не делает мою последнюю попытку длиной 12 байт?
Спасибо!
Редактировать Свойство lock
является уникальным идентификатором элемента для обнаружения коллизий хешей.