【发布时间】:2014-04-07 14:11:40
【问题描述】:
这是一个出于好奇而不是任何重要的问题,但我只是想知道memmove 文档中的以下 sn-p:
复制发生就像使用了中间缓冲区
(强调我的)。该公式向我表明,是否使用中间缓冲区是特定于编译器实现的。
如果您要我写memmove,我可能会自动执行以下操作:
- 在堆上分配
n字节 -
memcpytemp 的来源 -
memcpy到目的地的温度 - 释放缓冲区
我希望任何人都可以......
- ... 确认该公式是否只是因为用户更容易可视化正在发生的事情,而没有修复特定实现实际上必须使用中间缓冲区;
- ... 阐明了一些常见 C++ 编译器(如
gcc或 Visual C++)中的 实际 实现 - 例如,确实 它使用缓冲区它是否检查重叠,以便可以直接memcpy; - ...也许可以指出我上面的简单算法中明显的错误/效率低下。
【问题讨论】:
-
据我了解,它的措辞是为了确保它正确处理在 SAME BUFFER 中正确复制的情况。在某些情况下,这似乎需要中间缓冲区。
-
'As if' 表示源区域和目标区域重叠时数据不会被破坏。这可以通过在适当的方向复制来简单地实现,地址被递增或递减,具体取决于哪个部分重叠。但是,如果位移是 1 个字节,那么效果会急剧下降 - 数据必须按字节复制,而不是按 4 字节块复制。然后 CPU 寄存器可以用作缓冲区 - 但仍然不需要额外的内存缓冲区。
-
谢谢@CiaPan,这就是我正在寻找的东西。使用缓冲区可以防止这种情况发生,但对于大的非重叠块来说效率低下。所以我想知道
memmove在这方面有多少“智慧”来选择合适的策略。 -
不需要太多的智慧。它将向前或向后迭代源字节,具体取决于目标如何与源重叠。