【问题标题】:realloc variantsrealloc 变体
【发布时间】:2012-11-30 11:12:54
【问题描述】:

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

  1. 是否有一种 realloc 变体可以像 calloc 一样将内存区域“归零”? 我在这里需要它,因为这些项目不仅是指针,而且列出了头:问题是确保一个空列表是/显示为 NULL。否则,是memset(p, size, 0);

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

    • 使用重新分配
    • (free &) 使用 alloc
    • (免费和)使用 calloc

在任何情况下都是正确的:realloc 尝试在原地分配更多空间,否则分配到其他地方并静默复制?如果是,那么问题可能是(至少)三个用例需要不同的操作——在有或没有足够空间的两种情况下——但是一个完全没有选项的函数:

  • 我需要更多的空间来存放这些数据,并且还需要更多(标准)。
  • 我需要更多的地方,但从现在开始数据就是垃圾。
  • 我需要更多空间和要“归零”的区域。

对我来说最好的选择是什么?你还有什么看法?我在哪里可以找到有关该主题的更多反思或信息?

alloc 与 calloc 和 realloc 有不同的接口有什么原因吗? (我的意思是指定总尺寸与单一尺寸和计数)

[1] 原来是为了做有序集合&地图;对于字符串池,它不需要但不会打扰。相反,它使代码更清晰,并提供了引用的局部性。

【问题讨论】:

    标签: c realloc


    【解决方案1】:

    是否有一种 realloc 变体可以像 calloc 一样将内存区域“归零”?

    没有。

    如果没有足够的空间来就地增长,是否有一种不会复制的 realloc 变体,而是像 alloc 一样分配?

    没有。

    如果我是你,我可能会使用 free 和 calloc。但理想情况下,您希望将系统设计为不经常重新分配,因此各种选项的不同性能特征并不显着。换句话说,请确保您选择的选项无关紧要。

    【讨论】:

    • 谢谢。现在一切都清楚了。我还没有决定要选择的选项。池的设计或多或少如您所建议的那样,它允许您将一组字符串“批量存储”在一起,因此只有一个增长操作(如果有的话)。你怎么看? (实际上,我设计了所有具有这种可能性的集合类型。)但是,虽然问题集中在这种情况下,但我想了解更多一般情况。再次感谢。
    • 我不知道。正如我所说,如果可能,您应该设计系统,使分配不是瓶颈。没关系。但如果你不能,那么你需要为各种选项计时。
    【解决方案2】:

    是否有一种 realloc 变体可以将内存区域“归零”,例如 卡洛克?我在这里需要它,因为这些项目不仅是指针,而且 列出头:问题是确保一个空列表是/显示为 NULL。 否则,只是 memset(p, size, 0); 的最佳解决方案;

    如果您严格按照标准进行编码,那么您就会被 memset 困住。至少这个很容易解决。

    如果您有一些特定于平台的余地,其中一些确实具有recalloc 函数。

    是否存在不复制的 realloc 变体,如果没有的话 有足够的空间在原地生长,而是像分配一样分配? 这里的问题是我不再需要数据了,因为字符串 需要根据新的模数在列表中重新分配。否则,什么 是最好的选择吗?

    再次不,很遗憾。

    有一个proposal for C1X 添加了这两个功能(以及其他功能),但现在你被realloc 的当前行为困住了。

    【讨论】:

    • 好的,谢谢。当我有时间时,我会尝试一些 free + new alloc 来看看分配器重用刚刚释放的内存的频率。这会给我最好的。可能有一些策略,因为我的情况相当普遍(正如你所说,他们认为这是标准病)。不仅我只是在分配之前释放,而且编译器很清楚这是使用相同的指针变量......(它可能会为分配器提供线索)
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2012-10-01
    • 2014-01-31
    • 2016-05-26
    • 2019-12-21
    • 2013-11-29
    相关资源
    最近更新 更多