[英]memcpy performance vs byte shift
有兩個變量:
uint32_t var32 = 0xAABBCCDD;
uint8_t var8[4] = { 0, 0, 0, 0 };
哪個var32到var8的復制方式會更快?
for (size_t i = 0; i < sizeof(uint32_t); i++)
var8[i] = (uint8_t)(var32 >> (i * 8));
要么
memcpy(var8, &var32, sizeof(uint32_t));
我會很感激所有的提示。
假設采用32位架構, memcpy
歸結為單個mov
(或類似)指令。 因此,它是速度更快。 但這也是錯的。 從C的角度來看,您正在調用實現定義的行為。 實際上可能發生的是你的字節被錯誤地排序,這取決於你是在大端還是小端平台上。 因此,只需使用位移解決方案而不是擔心性能。
C中的memcpy通常在現代編譯器中得到保證,以優化成為最快的復制方式。 但是,這確實假設它在您的實現中正確內聯。
我也不相信這會導致嚴格的別名沖突,因為兩個指針永遠不會為同一個內存添加別名。
但是,int的字節被復制到數組的哪個字節的順序是實現定義的。 如果你希望確保這將總是在大端序中,你可以首先在int上運行htonl
,這將使它成為大端,然后復制的結果將被很好地定義。 在不需要的情況下,這也將優化為零,使其始終是任何系統上最快的實現。
另一方面,如果你想要小端字節排序,請使用htole32
來確保int在任何硬件上變成小端。 但請注意, htole32
是BSD,Linux和各種其他操作系統的擴展, htole32
保證可用於所有實現(讀取,非標准)。
我認為memcpy會更快,因為它不計算只使用移動。 字節移位有兩步計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.