【发布时间】:2013-07-26 20:46:39
【问题描述】:
为方便起见,我只使用纯文本示例。例如,对于句子I have a cat,我需要malloc 13 个char 变量槽,以便它存储所有带有最终\0 的字母。
但是,如果现在我想在 cat 之前插入 lovely 怎么办?看来我必须创建一个足够大的新数组并复制所有内容。
更糟糕的是,由于计算机无法预测会添加多少东西,所以每次添加新字母时我似乎都必须做这个重新malloc并复制东西,即为每个字母lovely,结果证明这不是一个聪明的解决方案。 (电脑不会提前知道“可爱”这个词吧?)
一个“更好”的解决方案似乎是首先创建一个足够大的数组,这样每次插入一个新字母时,程序只会复制并移动它后面的所有内容。但是,这仍然是低效的,尤其是当文档很长并且我从头开始添加内容时。
这同样适用于“删除”,每次删除一个字母时,我都必须复制它之后的所有内容并缩小数组大小,看来。
使用节点而不是数组来存储内容似乎是一个同样糟糕的解决方案,因为现在每次我想在内容中间做某事时,我都必须从头开始走一条路。
那么在这种情况下,管理内存的正确或有效方法是什么?我想要在 C 等低级别编程的答案,这需要直接内存分配和取消分配,而不需要已经为您处理所有事情的“魔术”函数或库。
【问题讨论】:
-
如果你问十个人,你会得到十个不同的答案。我们需要有关您的方案的更多信息。关键因素是什么?性能有多重要,您是否知道整个进程或空间所需的内存总量?你期望这些东西多久增长一次等等。人们写关于这个主题的博士学位。也就是说,一些经典的想法是循环缓冲区,指数增长。如果连续内存不是问题,那么您可以查看其他表示形式,例如链表和树。但这取决于您的要求。
-
我认为关键因素是快速插入/删除内容的能力。内存总量可能无法预测,因为容量应根据需要增长。您可以将其设想为类似于文档编辑器的东西,您可以在其中快速进入段落中的任何位置并在那里插入/删除内容,并且您不知道用户的写作时间有多长,对吗?这是一个类似的场景。
标签: c memory memory-management operating-system