realloc变体

3

为了让大家了解背景,这是关于字符串池的问题,意思是一个带有字符串键的哈希表(实际上是知道它们长度的特殊字符串,但我想这个细节在这里不相关)。重点是当池需要增长时调整列表数组(用作表桶)的大小。但是——这是核心细节——包含字符串的单元格实际上在单元格数组中,而不是分散在内存的各个角落[1]。因此,我不再需要列表,它们只是过时的东西。所以:

  1. 是否有一种realloc的变体可以像calloc一样“清零”内存区域? 我需要在这里使用它,因为项目不仅是指针,而且是列表头:问题是确保空列表为空或显示为NULL。否则,最好的解决方案是什么? memset(p, size, 0);

  2. 是否有一种realloc的变体,如果没有足够的空间在原地增长,就不会复制,而只是像alloc一样分配?这里的问题是我不再需要数据,因为字符串需要根据新模数重新分布到列表中。否则,最佳选择是什么?

    • 使用realloc
    • (释放并)使用alloc
    • (释放并)使用calloc

无论如何,这是正确的:realloc尝试在原地分配更多空间,否则在其他地方分配并静默复制?如果是,则可能存在至少三种使用情况,需要不同的操作——无论是在有足够空间还是没有足够空间的情况下——但单个函数没有任何选项:

  • 我需要更多的空间来存储这些数据和将来的数据(标准)。
  • 我需要更多的空间,但是数据从现在开始就是垃圾。
  • 我需要更多的空间,且区域被“清零”。

对我来说哪个选项最好?你还有什么想法吗?在哪里可以找到更多关于此主题的思考或信息?

为什么alloc与calloc和realloc具有不同的接口?(我的意思是指定总大小与单个大小和计数)

[1] 最初的重点是创建有序集和映射;对于字符串池,这是不必要的,但不会影响。相反,它使代码更清晰,并提供了引用的局部性。

2个回答

4

有没有一种“清零”内存区域的realloc变体类似于calloc?

没有。

是否有一种realloc变体,如果没有足够的空间在原地增长,则不进行复制,而只是像alloc一样进行分配?

没有。

如果我是你,我可能会使用freecalloc。但理想情况下,您要设计您的系统,使得重新分配很少发生,因此各种选项的不同性能特征并不重要。换句话说,确保选择哪个选项都无关紧要。


谢谢。现在事情很清楚了。我还没有决定选择哪个选项。池的设计与您提议的大致相同,它允许您将一组字符串“批量存储”在一起,因此只有一个增长操作(如果有)。您认为呢?(实际上,我设计所有集合类型都具备这种可能性。)但是,虽然问题集中在这种情况上,我想更多地了解一般情况。再次感谢。 - denis 63
我不知道。正如我所说,如果可能的话,你应该设计系统,使分配不成为瓶颈。那么就无关紧要了。但是,如果你不能这样做,那么你需要计时各种选项。 - David Heffernan

1
有没有一种类似于calloc的realloc变体,可以将内存区域“清零”?我需要这个功能,因为这些项不仅是指针,而且是列表头:问题在于确保空列表显示为空值。否则,最好的解决方案就是使用memset(p, size, 0);
如果您只是编写标准代码,那么您只能使用memset。至少这个问题很容易解决。
如果您有一些特定于平台的自由度,则其中一些平台具有recalloc函数。
有没有一种realloc的变体,如果没有足够的空间进行增长,就不会复制,而是像alloc一样分配?这里的问题是我不再需要数据,因为字符串需要根据新的模数重新分配到列表中。否则,最好的选择是什么?
同样,不幸的是,没有这样的函数。

有一个C1X提案,其中包括这两个功能(以及其他一些),但目前您只能使用realloc的当前行为。


好的,谢谢。等我有时间了,我会尝试一些免费的+新的分配,以查看分配器多频繁地重用刚释放的内存。这将为我提供最佳结果。可能有一些策略,因为我的情况相当普遍(正如你所说,他们考虑了std)。不仅我只是在分配之前释放,而且编译器也很清楚这是使用相同的指针变量...(它可能会为分配器留下线索) - denis 63

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接