复制内存块

时间:2009-06-03 11:51:03

标签: c++ memory copy

我需要一个关于如何有效地复制内存块的建议,如果可能的话,用C ++或汇编语言一次性地复制。

我有一个指向内存位置和偏移量的指针。将内存视为我需要复制的包含行和列的2D数组。

6 个答案:

答案 0 :(得分:38)

std::memcpy怎么样?

答案 1 :(得分:4)

如果您需要自己实施此类功能,建议您检查Duff's Device是否必须高效完成。

答案 2 :(得分:2)

阅读您的评论,听起来您可能想要使用并行性。有指令要做,但它们只能在寄存器上操作,而不是内存。

这是因为计算机体系结构的方式(我假设是x86)。

您一次只能访问一个内存位置,因为计算机只有一个地址总线。如果您一次尝试访问多个位置,则会导致总线过载,无法正常工作。

如果您可以将所需数据放入寄存器中,那么您可以使用许多很酷的处理器指令(如MMX或SSE)来执行并行计算。但至于并行复制存储器,这是不可能的。

正如其他人所说,使用memcpy。它可靠,调试和快速。

答案 3 :(得分:1)

如果原点和源重叠,请使用memmove()。通常memcpy()和memmove()已经为编译器的clib进行了高度优化。如果您确实要编写替代品,请至少针对clib版本进行基准测试,以确保不会降低代码速度。

  

我有一个由5000行或更多行组成的块,并且在一个始终被调用10000次的函数中

另外,请考虑更改数据结构。也许不是二维数组,你可以有二维阵列指针的一维数组(列)。然后,您只需复制或移动指针,而不是复制整行。您可以将列数组合并到一个自由列表中,这样您就不会花费大量时间来分配和释放它们。

答案 4 :(得分:0)

memcpy

答案 5 :(得分:0)

或许在汇编中回复MOVSD?很难说没有关于你要复制的确切内容的更多信息......或者,你可以重新编程DMA控制器也可以这样做,但它实际上最终会比只使用处理器慢。 : - )