2010-03-10 25 views
3

我正在製作一個簡單的字節緩衝區,它的數據存儲在一個字符數組獲取新的和我只是想知道如果memcpy和memmove函數會給我什麼奇怪的,或者有什麼你會推薦做的?memmove,memcpy,和新的

+1

memcpy等沒有錯,但爲什麼不簡單地使用std :: string? – 2010-03-10 20:00:08

+1

我寧願跳過std :: string.c_str()的整個中間人,因爲它會傳遞給send()和recv()。 – Pragma 2010-03-10 20:15:00

+4

然後std:;矢量可能是你想要的。中間人是你的朋友。 – 2010-03-10 20:18:33

回答

3

不,他們完全沒問題。 newmalloc()只是兩種不同的方式,你可以在堆上獲得內存(實際上它們完全相同,因爲new在大多數實現中使用malloc())。只要您的手中有一個有效的char*變量(由newmalloc()或堆棧分配),它只是一個指向內存的指針,因此該系列中的memcpy()和其他函數將按預期工作。

+0

應該指出,你必須有一個'char *'變量是有效的。 'char * c = NULL;'或'char * c = 0xfacefeed;'可能不會很好地與'memcpy()'或'memmove()'搭配使用。 – 2010-03-11 02:12:02

+0

編輯澄清這種情況。謝謝! – pajton 2010-03-11 02:17:56

4

使用memcpy()/memmove()應該適用於那種數據。通常,您可以在任何POD類型上安全地使用它們。

+4

POD-ness是關鍵。 – 2010-03-10 19:59:55

2

對於char數組數據,它應該可以正常工作,即使與新的一起使用。

但是在C++中爲什麼不使用std :: copy或std :: copy_backward並完全消除這個問題?

0

我仍然會使用帶有std :: copy的向量,但這並不意味着new/memcpy/memmove是不好的。如果你堅持在緩衝區內移動部件,memmove實際上是首選。

1

這實際上取決於您的平臺,以及您的編譯器的實現newmemmove。大多數處理器體系結構在將數據與字邊界對齊時更好地混淆數據,但有些處理器體系結構會更好地執行其他情況。例如,PowerPC 7447在16 byte boundaries對齊的內存下運行速度最快。這就是Altivec SIMD指令集的向量寄存器的大小,因此memcpy或類似的函數可以在分配在16個字節邊界上的數組上實現更快的速度。例如,請參閱this question

爲什麼這對新產品有所幫助?因爲新運算符可以在它返回的指針前面的幾個字節中存儲一些關於分配的內存塊的元數據,所以它給出的實際指針在實際分配開始之後是一兩個字。在我遇到這種行爲的CPU,操作系統和編譯器(PowerPC 7447a,VxWorks 5.5,GCC 2.95)上,新運算符保證爲您提供8個字節對齊但不是16個字節對齊的塊。這當然是非常具體的實現。我不相信C++標準中有任何指定對齊方式的東西,因爲這將成爲架構特定的優化。

所有這一切的關鍵在於,如果您在某個平臺上並且關注像對齊這樣的低級別優化問題,它可能會帶來輕微的性能差異。對於大多數應用程序,您可能不需要擔心這一點。

+0

「新運算符可以在它返回的指針之前的幾個字節之前存儲有關分配的內存塊的元數據,因此它給出的實際指針是實際分配開始之後的一兩個字」就像malloc()那樣。 – 2010-03-10 20:47:03

+0

是的。就像malloc一樣。某些平臺提供了一種替代內存分配功能,允許您指定內存的對齊邊界。如果你真的關心對齊,你應該尋找這些例程之一。 – 2010-03-13 18:41:46