【发布时间】:2015-06-04 16:17:26
【问题描述】:
最近我一直在用 C 编写大量代码,并且我注意到,在我的程序中花费最多时间的事情是调整动态数据结构的大小。假设我们有一个包含字符的数组,我想在这个数组的末尾附加一些字符。我是这样做的:
- 检查是否分配了足够的内存。
- 如果不是,则将数组重新分配到大小为两倍的数组(使用 realloc)
- 如果现在有足够的内存,追加字符,否则转到第 2 点。
我只是想知道这是否足够有效。例如,我可以考虑类似树结构的东西,我会将数组保存在树的节点中,这样我就不会在添加之前将旧元素复制到新数组中,而是将新的 malloc'ed 元素添加到下一个树的节点并在那里附加字符。这样我就可以避免不必要的复制...
所以这只是以不同方式调整大小的一种方法。我应该寻找其他东西还是将旧元素复制到两倍大小的新数组的解决方案足够有效?
【问题讨论】:
-
寻求基于意见的答案的问题在这里是不合适的,所以我投票结束了这个问题。不过,您需要考虑一件重要的事情——您认为您可能需要将内存翻倍(以及您有多少内存可以继续分配)?您是否会达到仅添加一个条目而加倍的系统资源成本太高的地步?如果您可以合理地使用链表/树等,而不是单个大缓冲区,那么您可能应该这样做。
-
一般来说,复杂的树永远不值得花时间去实现它。 1.5 的 realloc 就好了。
-
@user3125367 是的,应该真正使用已经提供它们的语言。 C 不是其中之一。
-
@PeterSchneider 您的评论似乎有点讽刺(没关系)。实际上,复杂的树在任何语言中都很难,除非实现隐藏在某个接口下。然后您会体验到该接口的开销,因为将索引和迭代器映射到“平凡的用户空间”变得不平凡。可以从 sourceforge 等获取无数个 adt 库中的任何一个并使用它,因此 C 确实 提供了工具。不过,复杂性的价值仍然是一个大问题。
-
@DrunkCoder 有趣的见解,谢谢。
标签: c arrays data-structures