复制内存块

14

我需要一个建议,关于如何在C++或汇编语言中高效地复制一块内存,如果可能的话,在单次尝试中完成。

我有一个指向内存位置和偏移量的指针。可以将内存想象为由行和列组成的二维数组,我需要复制这个数组。

6个回答

42

使用memcpy,因为它通常对目标架构最优。在x86架构中,最优实现使用几个128位SSE寄存器。 - Eric Bainville
嗯,我已经尝试过那个方法了。memcopy函数的作用是逐行复制数据。想象一下,如果我有一个包含5000行或更多的数据块,在一个被调用了10000次的函数中使用。 - Abdul Khaliq
2
如果所有行在内存中是连续的,你可以在一个memcpy调用中复制所有行。如果行之间的间隙很小,一个memcpy调用可能是最快的方式。如果所有行都是单独分配的,则需要使用memcpy循环。 - Eric Bainville
1
请注意,源内存区域和目标内存区域不能重叠。如果它们重叠了,您需要创建一个算法来执行N个非重叠的memcpy操作,而不是单个操作。 - David Rodríguez - dribeas
抱歉,memcpy已被认为不安全。:P - Sanjaya R

6

你的回答帮助我节省了几毫秒,非常感谢。 - Abdul Khaliq

2
阅读您的评论,听起来您可能想使用并行处理。虽然有相关指令可供使用,但它们只能操作寄存器而非内存。
这是由于计算机体系结构的限制(我假设是x86架构)。
由于计算机只有一个地址总线,因此一次只能访问一个内存位置。如果您尝试同时访问多个位置,将会超载总线,导致无法正常工作。
如果您可以将需要的数据放入寄存器中,则可以使用许多很酷的处理器指令,例如MMX或SSE,来执行并行计算。但是,如果要并行复制内存,则不可能实现。
如其他人所说,请使用memcpy。它可靠、经过调试且速度快。

1

如果源和目标重叠,请使用memmove()。通常情况下,memcpy()和memmove()已经针对您的编译器的clib进行了高度优化。如果您确实要编写替代代码,请至少将其与clib版本进行基准测试,以确保不会减慢代码速度。

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

此外,考虑更改数据结构。也许您可以拥有一个指向二级数组(列)的指针的一维数组,而不是一个二维数组。然后,您只需要复制或移动指针,而不是整个行。您可以在Free-List中汇集列数组,这样您就不必花费大量时间来分配和释放它们。


0

memcpy

(注:此为编程相关内容)

0

汇编中的REP MOVSD?如果没有更多关于您要复制的内容的信息,很难说...或者,您可以重新编程DMA控制器来完成它,但实际上它会比仅使用处理器更慢。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接