簡體   English   中英

memcpy性能與字節移位

[英]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.

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