我考虑过如何提高读取按(无符号)整数排序的列表的性能,该整数在程序启动时读入,并且在程序退出之前不会更改。我考虑了不同的可能性,但后来我有了一个想法,我想知道这是否可能,如果不可能,为什么不呢 - 因为根据我的理论,这对于计算机来说应该是可能的。
我有一个大约有 10.000 个条目的列表,每个条目都有一个唯一的 ID(唯一 ID 不为 0)。现在分配大小为 object* pList = new(sizeof(object) * max_unique_id)
的内存,然后删除所有未使用的内存(检查不存在哪些唯一 id 并释放该位置的内存)大小为 sizeof(object))...您将仅使用所需的内存,并且您可以使用 pList[unique_id]
访问列表条目 -> 会非常非常快。 .但是你不能删除动态分配数组中的单个元素:/在程序终止时你当然可以释放所有元素,将指针+大小保存在 std::vector 或类似的东西中是没有问题的。
这就是为什么我要问我的理论是否不正确,或者系统是否不允许这样做,或者问题出在哪里。
最佳答案
不,你不能那样控制内存。然而,可以有一点作弊的可能。如果您要分配大块内存,则可以创建自己的内存池。这样,您就可以自己创建漏洞并将该内存用于程序的其他部分。
但我不推荐它,因为您可能会遇到严格别名的问题,并且必须处理代码中更复杂的问题。
稍微倒回一下,您会忘记缓存效果,这很重要。将对象紧密地排列在一起可能比加快查找速度对速度产生更大的影响。
要实现此目的,您可以使用简单的哈希来查找对象,或者您可以只创建 16 位索引的稀疏索引数组。
关于C++ 释放确切大小的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35398064/