保持地址之间的差异而不是存储指向下一个地址(链表)的指针?

Keeping difference between to addresses instead of storing a pointer to next address (linked list)?

我想减少我自己的堆分配器的元数据结构的大小。我的结构中的一个字段包含指向该结构的下一个实例的指针:

typedef struct _metadata_entry_t {
   struct _metadata_entry_t* next_free_block;
   // signed int bytes_to_next_free_block;
} metadata;

注意最后两个字段是我到达下一个“空闲块”的两种方式。我的系统(这是我唯一关心的系统)上的指针是 8 个字节,而有符号整数是 4 个字节。我认为这是减少我的结构大小的好方法(权衡即时访问一些 void 指针算法)。这样做有什么问题吗?

此外,由于我可以确保这些元数据结构的地址在内存中对齐到 8 字节,也许我可以以某种方式截断地址并将其存储在较小的数据类型中?不太确定是否可以做到。

如果内存池被分配为单个对象(如单个 malloc() 或全局数组的结果),则可以安全地使用指针算法。

bytes_to_next_free_block = (char*)ptr - (char*)pool_start;

但是,我建议使用另一个技巧。

_metadata_entry_t 放入空闲列表中的实际空块内。 每当释放一个块时,您都会将其元数据放在已释放块的第一个字节中。当块由调用者分配时,然后从空闲列表中删除块的元数据,擦除记录和 return 块给调用者。

该块要么由分配器拥有,要么包含元数据。或者该块属于图书馆用户并填充了用户的数据。

这样元数据的大小实际上并不重要,只要最小分配至少与元数据一样大(在您的情况下为 8 字节)。