我正在製作一個簡單的字節緩衝區,它的數據存儲在一個字符數組獲取新的和我只是想知道如果memcpy和memmove函數會給我什麼奇怪的,或者有什麼你會推薦做的?memmove,memcpy,和新的
回答
不,他們完全沒問題。 new
和malloc()
只是兩種不同的方式,你可以在堆上獲得內存(實際上它們完全相同,因爲new
在大多數實現中使用malloc()
)。只要您的手中有一個有效的char*
變量(由new
,malloc()
或堆棧分配),它只是一個指向內存的指針,因此該系列中的memcpy()
和其他函數將按預期工作。
應該指出,你必須有一個'char *'變量是有效的。 'char * c = NULL;'或'char * c = 0xfacefeed;'可能不會很好地與'memcpy()'或'memmove()'搭配使用。 – 2010-03-11 02:12:02
編輯澄清這種情況。謝謝! – pajton 2010-03-11 02:17:56
使用memcpy()
/memmove()
應該適用於那種數據。通常,您可以在任何POD類型上安全地使用它們。
POD-ness是關鍵。 – 2010-03-10 19:59:55
對於char數組數據,它應該可以正常工作,即使與新的一起使用。
但是在C++中爲什麼不使用std :: copy或std :: copy_backward並完全消除這個問題?
我仍然會使用帶有std :: copy的向量,但這並不意味着new/memcpy/memmove是不好的。如果你堅持在緩衝區內移動部件,memmove實際上是首選。
這實際上取決於您的平臺,以及您的編譯器的實現new
和memmove
。大多數處理器體系結構在將數據與字邊界對齊時更好地混淆數據,但有些處理器體系結構會更好地執行其他情況。例如,PowerPC 7447在16 byte boundaries對齊的內存下運行速度最快。這就是Altivec SIMD指令集的向量寄存器的大小,因此memcpy或類似的函數可以在分配在16個字節邊界上的數組上實現更快的速度。例如,請參閱this question。
爲什麼這對新產品有所幫助?因爲新運算符可以在它返回的指針前面的幾個字節中存儲一些關於分配的內存塊的元數據,所以它給出的實際指針在實際分配開始之後是一兩個字。在我遇到這種行爲的CPU,操作系統和編譯器(PowerPC 7447a,VxWorks 5.5,GCC 2.95)上,新運算符保證爲您提供8個字節對齊但不是16個字節對齊的塊。這當然是非常具體的實現。我不相信C++標準中有任何指定對齊方式的東西,因爲這將成爲架構特定的優化。
所有這一切的關鍵在於,如果您在某個平臺上並且關注像對齊這樣的低級別優化問題,它可能會帶來輕微的性能差異。對於大多數應用程序,您可能不需要擔心這一點。
「新運算符可以在它返回的指針之前的幾個字節之前存儲有關分配的內存塊的元數據,因此它給出的實際指針是實際分配開始之後的一兩個字」就像malloc()那樣。 – 2010-03-10 20:47:03
是的。就像malloc一樣。某些平臺提供了一種替代內存分配功能,允許您指定內存的對齊邊界。如果你真的關心對齊,你應該尋找這些例程之一。 – 2010-03-13 18:41:46
- 1. 問:memmove()和memcpy()在QT(C++)
- 2. memcpy/memmove的奇怪行爲
- 3. memcpy memmove的解釋GLIBC_2.14/2.2.5
- 4. std :: copy/memcpy/memmove優化
- 5. memmove與memcpy比較兩次的性能?
- 6. Realloc和memmove
- 7. 在什麼平臺上memmove和memcpy可以有顯着的性能差異?
- 8. 編譯器將std :: copy複製到memcpy(memmove)的條件是什麼
- 9. 什麼時候應該使用memcpy,什麼時候應該使用memmove?
- 10. memcpy和指針
- 11. 由一個的memmove
- 12. Memmove和SIGSEGV在C中的問題
- 13. memmove與overlaping
- 14. SIGSEGV memcopy或memmove
- 15. C++ Array MEMMOVE bug
- 16. Microsoft SDL和memcpy depobation
- 17. ARM memcpy和對齊
- 18. memset,新運算符memcpy
- 19. 關於memmove的實施
- 20. memcpy--內核崩潰後memcpy
- 21. memcpy和const正確性
- 22. memcpy和內存管理pcap
- 23. ç別名規則和memcpy
- 24. memmove留下垃圾 - C
- 25. 快速的memcpy
- 26. 的memcpy混亂
- 27. 錯誤的memcpy
- 28. memcpy的使用()
- 29. 用的memcpy
- 30. GCC代替循環用的memcpy和memset
memcpy等沒有錯,但爲什麼不簡單地使用std :: string? – 2010-03-10 20:00:08
我寧願跳過std :: string.c_str()的整個中間人,因爲它會傳遞給send()和recv()。 – Pragma 2010-03-10 20:15:00
然後std:;矢量可能是你想要的。中間人是你的朋友。 –
2010-03-10 20:18:33