【发布时间】:2021-09-17 11:36:22
【问题描述】:
我在大学里了解到,当实现为结构的动态数组时,在 C 中实现,比如说一个列表,缓存效率会更高。因此,据我了解,它的 O(N) malloc 调用与(最坏情况) O(N log(N)) 时间复杂度通过 realloc 调用来维护内存。但是大量数据的“真实列表”会导致更多的缓存未命中。是否有 goto 选项,或者它取决于?
【问题讨论】:
-
我认为“这取决于”它。这在很大程度上取决于您最有可能如何访问列表中的成员:主要是按顺序访问,还是主要是随机访问?
-
不幸的是,这种开放式问题不太适合像堆栈溢出这样的客观编程问答网站。
-
如果您可以描述如何计划访问数据以及实际数据是什么,那么用事实(如基准)来回答会更容易。
-
实际上我对“它取决于”很好。只是想确保我对该主题有正确的理解。 ATM 我正在研究字符串的 R/B 树。也许我以两种方式实现它并对实际数据进行基准测试。它甚至不是时间紧迫的,我只是好奇。
-
动态数组可以使用 2 的幂增长策略有效地调整大小。例如,这就是 C++ 中著名的
std::vector的作用。这只需要O(log(n))分配和复制(并且开销与数组的大小成线性关系)。列表也可以使用存储桶进行优化,以减少分配量。在大多数情况下,数组更好。但是,考虑到访问模式和数据大小,在某些情况下,列表可能会更好,例如在中间插入一些项目或进行拼接时。
标签: c performance dynamic-memory-allocation