我正在通过将字节复制到动态数组来将文件读入C中的内存。
当前,每次新字节进入时,我都会重新分配()一个字节。这似乎效率低下。有人建议(我不记得在哪里)每次需要更多的内存是好的,因为它是O(log n)分配时间,唯一的代价是最差情况下只有不到一半的内存是未使用。
有关内存分配的任何建议吗?
答案 0 :(得分:6)
执行一些建议(每次需要更多空间时,通过乘法因子增加缓冲区的大小)。我做了很多次,效果很好。如果你不喜欢因子2,你可以使用别的东西。我用Phi(黄金比例)效果很好。
答案 1 :(得分:6)
如果要将整个文件加载到字符串中,则可以使用此question中概述的方法。这样你就可以获得文件的大小(以字节为单位)并分配你的字符串来保存(不要忘记空字符的额外字节)。
但是,如果你动态增长一个字符串,最好将它的大小增加一个大于单个字节的因子(重新分配一个字符串,每个字节将非常慢,特别是如果字符串必须分配在一个新的内存区域,然后复制过来)。由于您正在阅读文件翻倍,因此可能非常合理。我见过人们也使用其他方法来做到这一点,例如:
我看到人们轮到2的下一个幂,例如2,4,8,然后是16个字节。 (这基本上是每次文件大小加倍)。
我也看到人们使用的值更适合他们打算阅读的字符串,即。一次100个字节。
如果你过度分配字符串,你总是可以在最后重新分配内存,最后重新分配到你需要的确切大小。
答案 2 :(得分:2)
我没有在我面前引用它,它可能是一个特定于实现的细节,但我相信2次调整大小的指针是用来调整C ++ STL的{{1对象,因为字符不断添加。 (通过在添加字符时调用string::capacity
方法来验证这一点应该很容易。)