【问题标题】:malloc less than 8 bytes [closed]malloc 小于 8 个字节 [关闭]
【发布时间】:2015-01-14 17:25:37
【问题描述】:

malloc 在堆上说 4 个字节是否有意义,因为 malloc 在内部通常会将其四舍五入到 32 位系统上的 8 字节边界和 64 字节系统上的 16 字节边界以供其内部使用。

我需要分配一个字符串来存储一位数或两位数。因此,我最多需要 3 个字节(两位数为 2,'\0' 字符为 1 来终止我的字符串)。想知道执行 malloc 3 是否有任何好处,我是否应该改为执行 malloc 8?

有什么想法吗?

【问题讨论】:

  • 使用std::string,不用担心为字符串分配和释放内存。
  • 内存真的是个问题还是你只是想优化?
  • 分配你需要的任何内存。如果你需要 3 个字节而你要求 8 个字节,你会如何处理额外的 5 个字节?如果您对这 5 个字节有合法用途,请定义一个 8 字节结构并使用它。
  • 您是否分配额外的字节并且不使用它们或者堆分配器确实绝对没有区别。除了有一天必须维护您的代码的不幸受害者。
  • @iharob:可能......因为它对任何一个都同样有效。虽然这可能是巧合。

标签: c++ c memory malloc


【解决方案1】:

分配你需要的,不用担心内存使用。

智能内存分配器将具有用于分配小块的单独内存池。

例如,内存分配器可能有一个单独的内存池,用于分配小于 8 字节的项目。

【讨论】:

    【解决方案2】:

    是的,只问你需要什么是绝对有意义的。

    分配器(mallocnewVirtualAlloc 或你有什么)可能总是填充你的分配,但一般来说这不是你关心的问题。
    无论如何,由于混合方案/针对不同大小的不同池,它可能会比较小的分配更多地填充更大的分配。

    无论如何,除非您有大量分配,否则不要担心该开销,因此分配器开销可能是压死骆驼的最后一根稻草。

    此外,分配器可能会被更改或简单地替换(为了更好的空间/时间性能、调试体验、容错性,只是因为),你真的不想泄露所有细节如何最后一个分配器在你的代码中工作。

    尤其是您不希望竭尽全力应对因更好地调整您的用例而带来的任何可能的改进。

    【讨论】:

      【解决方案3】:

      最好要求所需的大小,而不是更大的数量,*Deduplicator 也回答了

      如果 OP 发现未来需要分配 0 字节,则存在一个重要例外。

      在这种情况下,像malloc(0) 这样的分配器可能会返回NULL 或指针——C 规范允许其中任何一种。这可能会混淆或破坏专门期望这两者之一的后续代码。因此,当代码需要分配0 字节时,请考虑返回malloc(1)NULL,而不是将其留给malloc(0)

      【讨论】:

      • 这是一个重要的问题。恕我直言,语言上的真正缺陷,尤其是在转移到 realloc 时。
      • 需要分配0 字节吗?你能解释一下为什么有人会故意这样做吗?
      • @fiddlingBits,是的,我遇到过一些情况,我想分配可变数量的空间,在某些情况下可能为 0,你必须小心:malloc(nbytes) 返回NULL 不一定是nbytes == 0 出现错误,在以下步骤中可能会导致另一个错误,因此您只需决定始终分配至少一个字节——纯实用主义
      • @IngoLeonhardt 只是想知道为什么你会继续使用malloc(0) 而不是首先检查0if(nbytes > 0) malloc(nbytes)。顺便说一句:Deutschland über alles。 :-D
      • @FiddlingBits -- 仅仅因为指针为 NULL 导致之后的混乱.. Grüße aus Offenbach
      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多