2012-02-24 146 views
2

我正在查看一些C++代碼,並且遇到了這個memcpy函數。我瞭解memcpy的作用,但是他們向源添加了一個int。我試圖查找memcpy的源代碼,但我似乎無法理解添加實際上對memcpy函數做了什麼。Memcpy:添加一個int偏移量?

memcpy(Destination, SourceData + intSize, SourceDataSize); 

換句話說,我想知道SourceData + intSize在幹什麼。 (我想這個轉換成Java。)

編輯:

所以這是我在嘗試使用for循環在java中做一個memcpy函數...

for(int i = 0 ; i < SourceDataSize ; i ++) { 
     Destination[i] = SourceData[i + 0x100]; 
} 
+0

這與memcpy無關,它只是非常基本的指針算術 – 2012-02-24 20:28:33

+8

如何從語言A轉換爲完全不相關的語言B:1)理解原代碼應該做什麼; 2)瞭解原始代碼如何做它應該做的事情; 3)弄清楚在B語言中如何做到這一點; 4)編寫代碼。這個問題似乎缺少步驟#1和#2。你會很難得到很好的答案。 – 2012-02-24 20:28:37

+0

@ R.Martinho,理解什麼代碼*應該*做的一種方式是弄清楚它*做了什麼*。因此,我認爲這個問題是爲了完成第一步。 – 2012-02-24 20:42:41

回答

9

它是同樣的事情:

memcpy(&Destination[0], &SourceData[intSize], SourceDataSize); 
1

該插件會更改用於內存副本源的地址。

地址變化的數量將取決於SourceData的類型。

(參見http://www.learncpp.com/cpp-tutorial/68-pointers-arrays-and-pointer-arithmetic/

它可能試圖複製的陣列SourceData的部分起始於偏移intSize和長度SourceDataSize /的sizeof(* SourceData)的。

EDIT

因此,例如,如果陣列是的大小4個字節的整數的,那麼相應的Java代碼將如下所示:

for(int i = 0 ; i < SourceDataSize/4 ; i ++) { 
    Destination[i] = SourceData[i + intSize]; 
} 
1

這是基本的指針算術。 SourceData指向某些數據類型,並且向其添加n會增加n * sizeof(* SourceData)指向的地址。

例如,如果SourceData被定義爲:

uint32_t *SourceData; 

sizeof(uint32_t) == 4 

然後加入2至SourceData將由8.

增加它所佔用的地址作爲題外話,如果SourceData被定義爲一個數組,那麼向它添加n有時與訪問數組的第n個元素相同。很容易看到n == 0;當n == 1時,很容易看到你將在數組開始後訪問sizeof(* SourceData)字節的內存地址。

1

SourceData + intSize在源數據開始處跳過intSize * sizeof(源數據類型)字節。也許SourceDataSize存儲在那裏或類似的東西。

0

與Java最接近的memcpy相當於System.arraycopy,因爲Java並沒有真正的指針。在Java中

0

至於這樣做:

你的循環

for(int i = 0 ; i < SourceDataSize ; i ++) { 
     Destination[i] = SourceData[i + 0x100]; 
} 

總會開始複製從0x100元素融入SourceData數據;這可能不是理想的行爲。 (例如,當i=0,Destination[0] = SourceData[0 + 0x100];等等。)如果您從不想複製SourceData[0]..SourceData[0xFF],這將是您想要的,但請注意,硬編碼可防止它成爲memcpy的替代替代品。

intSize值在原始代碼中指定的原因可能是因爲第一intSize元素不是「實際」的數據的一部分,這些字節被用於簿記以某種方式(像什麼的總大小的記錄緩衝區是)。 memcpy本身不會「看到」偏移量;它只知道它開始的指針。 SourceData + intSize創建一個指針,指向intSize字節,過SourceData

但是,更重要的是,你在做什麼很可能是極其緩慢memcpy是一個嚴重優化的函數映射到大多數體系結構上經過仔細調優的程序集,並用一個簡單的每字節循環代替它將極大地影響代碼的性能特徵。如果您想了解memcpy和指針的工作原理,請注意,如果您試圖將現有代碼移植到Java以供實際使用,那麼您應該使用,您可能希望使用道德上等效的Java函數,如java.util.Arrays.copyOf