数百万)Item,其中每个 Item 都具有以下形式: struct Item { void *a; size_t b; }; 有一些不同的 a 字段——这意味着有 许多 项具有相-6ren">
gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:26 25 4
gpt4 key购买 nike

我有一个大数组(> 数百万)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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com