如何最小化struct-type的内存使用?

Chr*_*mer 3 c c++ memory-management alignment

对于Connect Four游戏的转置表(通常是哈希表),我想有效地使用内存(以存储尽可能多的元素).一个表元素必须存储以下信息:

  • 锁:无符号64位
  • 移动:[0..6] - >无符号3位
  • 得分:[ - 2000..2000] - >签名12位
  • flag:VALID,UBOUND,LBOUND: - > unsigned 2 bit
  • 高度:[ - 1..42]: - >签名7位

首先,我尝试了以下数据结构,需要24个字节:

struct TableEntry1
{
    unsigned __int64 lock;
    unsigned char move;
    short score;
    enum { VALID, UBOUND, LBOUND } flag;
    char height;
};
Run Code Online (Sandbox Code Playgroud)

重新排列元素后,它需要16个字节(我找到了这个行为的答案):

struct TableEntry2
{
    unsigned __int64 lock;
    enum { VALID, UBOUND, LBOUND } flag;
    short score;
    char height;
    unsigned char move;
};
Run Code Online (Sandbox Code Playgroud)

我的最后一次尝试是:

struct TableEntry3
{
    unsigned __int64 lock;
    unsigned int move:3;
    int score:12;
    enum { VALID, UBOUND, LBOUND } flag:2;
    int height:7;
};
Run Code Online (Sandbox Code Playgroud)

其中还需要16个字节.是否可以更改结构,使其仅使用12字节(在32位架构上)?为什么编译器不能让我最后一次尝试12个字节长?

谢谢!

编辑该属性lock是检测哈希冲突的唯一元素ID.

Fre*_*urk 6

是的,因为您只有88位信息,所以可以将其打包成96位(12字节); 但是,你真的需要吗?在极端情况下,请记住这样的打包会降低运行时性能.

如果你将这些文件存储到磁盘中,考虑到之前的微小效率会更有意义,但这就是这种情况吗?你有没有看过内存使用方面的问题?您需要多少内存,目前有16个字节的对象,以及它与您的计划限制有多接近?尝试优化运行时内存使用而不回答最后两个问题是不成熟的.

除此之外,我怀疑你的编译器在结构的末尾填充,所以__int64总是在8字节边界上对齐.考虑长度为2的这些数组:12字节大小,最多一个__int64子对象可以是8字节对齐.