2009-06-03 77 views
10

我需要一個關於如何有效地複製內存塊的建議,如果可能,以C++或彙編語言進行單次嘗試。複製內存塊

我有一個指向內存位置和偏移量的指針。將存儲器想象爲一個二維數組,我需要複製包含行和列。

回答

4

如果你需要自己實現這樣的功能,我建議你檢查Duff's Device是否必須有效地完成。

38

std::memcpy怎麼樣?    

+0

是的,使用memcpy,因爲它通常是目標架構的最佳選擇。在x86架構上,最佳實現使用一些128位SSE寄存器。 – 2009-06-03 11:55:30

+0

以及我已經嘗試過。什麼是memcopy,它一次只複製一行。想想我有一個由5000行或更多行組成的塊,並且在一個被所有時間調用10000次的函數中。 – 2009-06-03 11:57:10

2

閱讀您的評論,這聽起來像你可能想要使用並行。有指示要做到這一點,但它們只能在寄存器上運行,而不是在內存中運行。

這是因爲計算機架構的方式(我假設x86)。

一次只能訪問一個內存位置,因爲計算機只有一個地址總線。如果您嘗試一次訪問多個位置,則會導致公交車超載,因此無法正常工作。

如果你可以把你需要的數據放到寄存器中,那麼你可以使用很多很酷的處理器指令,比如MMX或SSE來執行並行計算。但至於並行複製內存,這是不可能的。

正如其他人所說,使用memcpy。它的可靠性,調試性和快速性。

0

REP MOVSD在彙編中可能嗎?很難說沒有關於你想要複製什麼的更多信息......或者,你也可以重新編程DMA控制器來實現它,但實際上它最終會比使用處理器慢。 :-)

1

如果原點和來源重疊,請使用memmove()。通常,memcpy()和memmove()已經被編譯器的clib高度優化了。如果你確實寫了一個替代品,至少要把它與clib版本進行比較,以確保你不會減慢你的代碼。

我已經由5000行以上的功能塊被稱爲所有的時間10000次

此外,考慮改變你的數據結構。也許而不是二維數組,你可以有一個指向二級數組的指針數組(列)。然後,而不是複製整個行,您只需複製或移動指針。你可以將列數組合併到一個自由列表中,這樣就不會花費大量時間分配和釋放它們。