/Does/ memmove 使用中间缓冲区吗?

Com*_*hip 1 c++ internals memmove

这更多是出于好奇而不是任何重要问题,但我只是想知道memmove 文档中的以下片段:

复制就像使用了中间缓冲区一样进行

(强调我的)。该公式向我表明,是否使用中间缓冲区是特定于编译器实现的。

如果您让我写memmove,我可能会自动执行以下操作:

  • n在堆上分配字节
  • memcpy 温度的来源
  • memcpy 到达目的地的温度
  • 释放缓冲区

我希望任何人都可以...

  1. ...确认公式是否仅仅是因为用户更容易看到正在发生的事情,而不是修复特定实现实际上必须使用中间缓冲区;
  2. ...阐明了一些常见的 C++ 编译器(如或 Visual C++)中的实际实现gcc——例如,是否使用缓冲区并检查重叠,以便它可以memcpy直接;
  3. ...也许可以指出我上面的简单算法中明显的错误/低效率。

Mik*_*our 5

  1. 的确。“好像”意味着它必须表现得像它所做的那样;但并不限制实现实际这样做。唯一需要的行为是目标缓冲区以来自源缓冲区的正确字节结束,无论缓冲区是否重叠。

  2. 一个常见的实现是,如果目标在源之前开始,则从缓冲区的开头向前复制字节,否则从末尾向后复制。这可确保在覆盖之前始终读取源字节(如果存在重叠)。

  3. 没有错误,除非分配失败。效率低下的是分配和释放临时缓冲区,并将每个字节复制两次而不是一次。