c++ - "factor out"公共(public)字段有什么办法可以节省空间?

标签 c++ c algorithm memory data-structures

我有一个大数组(> 数百万)Item,其中每个 Item 都具有以下形式:

struct Item { void *a; size_t b; };

有一些不同的 a 字段——这意味着有 许多 项具有相同的 a 字段。

我想“分解”这些信息以节省大约 50% 的内存使用量。

但是,问题在于这些 Item 具有重要的顺序,并且可能会随着时间的推移而改变。因此,我不能继续为每个不同的 a 创建一个单独的 Item[],因为那样会丢失项目之间的相对顺序。

另一方面,如果我存储 size_t index; 字段中所有项目的顺序,那么我将失去因删除 void *a; 字段。

那么有没有办法让我在这里真正节省内存,或者没有?

(注意:我已经可以想到例如使用 unsigned chara 索引一个小数组,但我想知道是否有更好的方法。那将要求我要么使用未对齐的内存,要么将每个 Item[] 分成两部分,这对内存局部性来说不是很好,所以我更喜欢其他东西。)

最佳答案

(Note: I can already think of e.g. using an unsigned char for a to index into a small array, but I'm wondering if there's a better way.)

这种想法是正确的,但并不是那么简单,因为您会遇到一些讨厌的对齐/填充问题,这些问题会抵消您的内存增益。

此时,当您开始尝试抓取像这样的结构的最后几个字节时,您可能会想要使用位域。

#define A_INDEX_BITS 3
struct Item { 
  size_t a_index : A_INDEX_BITS; 
  size_t b       : (sizeof(size_t) * CHAR_BIT) - A_INDEX_BITS; 
};

请注意,这将限制可用于 b 的位数,但在现代平台上,sizeof(size_t) 为 8,从中剥离 3-4 位很少成为问题。

关于c++ - "factor out"公共(public)字段有什么办法可以节省空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50319376/

相关文章:

android - 无法链接 libSTLport_shared,即使它存在...?

c++ - Visual Studio 2012 中的立方根函数 cbrt()

c++ - 处理大量

c++ - 计算无向图中的度数 - 逻辑问题

c++ - 黑盒系统。自定义主机上的安全软件

C 指针和临时变量

c - 按位计算负数

Codechef解决方案动态规划

php - 二维聚类算法

algorithm - 什么是找到图形质心的有效算法?