簡體   English   中英

memmove,memcpy和new

[英]memmove, memcpy, and new

我正在創建一個簡單的字節緩沖區,將其數據存儲在使用new獲取的char數組中,我只是想知道如果在使用new獲取的內存上使用memcpy和memmove函數是否會給我任何奇怪的信息,或者你有什么建議改為?

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

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

對於char數組數據,它甚至可以與new結合使用。

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

這實際上取決於您的平台,以及您的編譯器對newmemmove的實現。 大多數處理器體系結構在字邊界上對齊時會更好地改組數據,但有些處理器體系結構具有更好的性能。 例如,PowerPC 7447工作速度最快,內存在16字節邊界上對齊。 這是Altivec SIMD指令集的向量寄存器的大小,因此可以在16字節邊界上分配的數組上實現memcpy或類似的功能。 請參閱此問題以獲取示例。

為什么這會對新產品產生影響? 因為new運算符可以在它返回的指針之前的幾個字節中存儲一些關於分配的內存塊的元數據,所以它給你的實際指針是超過實際分配開始的一兩個字。 在我遇到此行為的CPU,OS和編譯器(PowerPC 7447a,VxWorks 5.5,GCC 2.95)上,新運算符保證為您提供8字節對齊但未對齊16字節的塊。 當然,這是非常具體的實現。 我不相信C ++標准中有任何指定對齊的東西,因為這將是一個特定於架構的優化。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM