我不确定以前是否有人问过这个问题,所以我会试一试。
我有用于加载大客户列表(20 万个客户)的代码。每个客户端都存储在一个(当前)固定大小的结构中,其中包含他的姓名、地址和电话号码,如下所示:
struct client {
char name[80];
char address[80];
char phonenumber[80];
};
Run Code Online (Sandbox Code Playgroud)
如您所见,该结构的大小为 240 字节。因此,200k 客户端将占用 48MB 内存。显然,这种结构的优点是易于管理并为回收客户创建“免费列表”。但是,如果明天我需要加载 5M 客户端,那么这将增长到 1.2Gb 的 RAM。
现在,显然在大多数情况下,客户的姓名、地址和电话号码占用的空间远少于 80 个字节,因此我想到使用如下结构代替上述结构:
struct client {
char *name;
char *address;
char *phonenumber;
};
Run Code Online (Sandbox Code Playgroud)
然后让 *name、*address 和 *phonenumber 指向以确切所需大小动态分配的结构,用于存储每个信息。
然而,我确实怀疑,随着更多客户端以这种方式加载,它会大大增加所需的 new[] 和 delete[] 分配的数量,我的问题是这是否会在某些时候损害性能,例如,如果我想突然删除 1M 客户端中的 500k 并用 350k 不同客户端替换它们?
我怀疑在我分配了 1M 个“可变长度”小缓冲区之后,如果我“删除”其中的许多缓冲区,然后想要创建新的分配来回收已删除的那些,是否会导致分配器的一些开销找到他们?