【发布时间】:2011-06-06 18:12:57
【问题描述】:
用于连接四的转置表(通常是哈希表) 游戏,我想有效地使用内存(尽可能存储 元素的数量)。一个表格元素必须存储以下信息:
- 锁定:无符号 64 位
- 移动:[0..6] --> 无符号 3 位
- 分数:[-2000..2000] --> 12 位签名
- 标志:有效,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 个字节(我为此找到了 answer 行为):
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是用于检测哈希冲突的唯一元素ID。
【问题讨论】:
-
对于转置表,重视速度而不是内存效率不是更有意义。为什么不正确对齐结构,而不是保存最后 4 个字节?我估计这会给您带来更好的整体性能。
-
@TommyA:转置表中可用的 Connect-Four-Game-Representations 越多,需要评估的 Game-Representations 就越少。评估成本更高。
-
无需优化即可获得最佳包装和最佳性能。只需按大小顺序列出成员。从最大到最小。然后编译器将添加最小峰值。 (经验法则)。
-
如果你强制优化太多,这可能对这个架构没问题,但是当你明年升级到 64 位 Windows 机器时,你可能会发现所有工作都浪费了,因为最小可寻址块是 64 位因此任何小于 8 字节的内容都会被填充。
标签: c++ c memory-management alignment