【问题标题】:preferring malloc over calloc [duplicate]更喜欢 malloc 而不是 calloc [重复]
【发布时间】:2011-05-13 15:39:13
【问题描述】:

可能重复:
c difference between malloc and calloc

在任何情况下您更喜欢 malloc 而不是 calloc。我知道 malloc 和 calloc 都动态分配内存,并且 calloc 还将分配的内存中的所有位初始化为零。 由此我猜想使用calloc而不是malloc总是更好。还是在某些情况下 malloc 更好?性能可能是?

【问题讨论】:

  • 投票重新打开这个。另一个问题是关于差异的。这个问题不一样。它询问为什么人们更喜欢 malloc(这是一种常见做法)。
  • @RaymondHettinger,如果我没记错的话,他们的答案是否相同并不重要。

标签: c malloc calloc


【解决方案1】:

如果您需要对动态分配的内存进行零初始化,请使用calloc

如果您不需要将动态分配的内存进行零初始化,请使用malloc

您并不总是需要零初始化内存;如果您不需要对内存进行零初始化,则无需支付初始化成本。例如,如果您分配内存然后立即复制数据以填充分配的内存,则没有任何理由执行零初始化。

callocmalloc 是做不同事情的函数:使用最适合您需要完成的任务的函数。

【讨论】:

  • Thanks.performance 是一个很好的观点。我也很想知道是否还有其他可能的原因。
  • (呃......他们关闭了你的问题,这与“重复”略有不同......我有时讨厌这样。)无论如何,有几个原因你可能希望使用 calloc 而不是 malloc .一是像 valgrind 这样的程序会使用 malloc 发出许多潜在的虚假警告。另一个与暴露错误有关。使用未初始化的内存可能会导致不稳定的行为,这可能会让您注意到一个错误,如果您使用 calloc,这些错误可能会被忽视。
【解决方案2】:

如果您不小心,依赖 calloc 的零初始化可能会很危险。归零内存按预期为整数类型提供 0,为 char 类型提供 \0。但不一定对应float/double 0或NULL指针。

【讨论】:

    【解决方案3】:

    您通常分配内存的特定目的是在其中存储一些东西。这意味着(至少大部分)由calloc 初始化的空间将很快被其他值覆盖。因此,大多数代码使用malloc 来获得一点额外的速度而没有真正的损失。

    我所看到的calloc 几乎唯一的用途是(据说)对 Java 相对于 C++ 的速度进行基准测试的代码。在 C++ 版本中,它使用calloc 分配了一些内存,然后使用memset 再次初始化内存(在我看来)这是一种相当透明的尝试,以产生有利于 Java 的结果。

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 2022-01-03
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2010-09-20
      • 2015-08-13
      相关资源
      最近更新 更多