我需要一个关于如何有效地复制内存块的建议,如果可能的话,用C ++或汇编语言一次性地复制。
我有一个指向内存位置和偏移量的指针。将内存视为我需要复制的包含行和列的2D数组。
答案 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)
答案 5 :(得分:0)
或许在汇编中回复MOVSD?很难说没有关于你要复制的确切内容的更多信息......或者,你可以重新编程DMA控制器也可以这样做,但它实际上最终会比只使用处理器慢。 : - )