为字符串分配内存的时间和内存高效方法

Del*_*ani 3 c memory-management

我通过将字节复制到动态数组,将文件读入C中的内存.目前,每次新字节进入时,我realloc()大一个字节.这似乎效率低下.

有些人建议(我不记得在哪里)每次需要更多的内存是好的,因为它是O(log n)分配时间,只有不到一半的内存未使用的最坏情况.

关于内存分配的任何建议?

Ste*_*son 6

做一些建议(每次需要更多空间时,通过乘法因子增加缓冲区的大小).我做了很多次,效果很好.如果你不喜欢因子2,你可以使用别的东西.我用Phi(黄金比例)效果很好.


GWW*_*GWW 6

如果要将整个文件加载到字符串中,则可以使用此问题中概述的方法.这样你就可以获得文件的大小(以字节为单位)并分配你的字符串以保存它(不要忘记空字符的额外字节).

但是,如果你动态增长一个字符串,最好将它的大小增加一个大于单个字节的因子(重新分配一个字符串,每个字节将非常慢,特别是如果字符串必须在一个新区域中分配的内存,然后复制过来).由于您正在阅读文件翻倍,因此可能非常合理.我见过人们也使用其他方法来做到这一点,例如:

  1. 我已经看到人们轮到2的下一个幂,例如2,4,8,然后是16个字节.(这基本上是每次文件大小加倍).

  2. 我也看到人们使用的值更适合他们打算阅读的字符串,即.一次100个字节.

如果你过度分配字符串,你总是可以在最后重新分配内存,最后重新分配到你需要的确切大小.

  • 我喜欢从2减去1的大小开始,然后每次空间不足时加倍加一.这可确保新大小始终大于或等于旧大小,而不包括对无符号包装模SIGE_MAX + 1的任何特殊处理.简单地加倍可能导致从成功的`SIZE_MAX/2 + 1`字节缓冲区步进到"成功的"0字节缓冲区和随后的堆破坏(假设系统的`malloc(0)`返回非NULL). (2认同)