memcpy 在主流編譯器中屬於 intrinsic 函數,編譯器內建實作並可根據參數特性(常數/變數、長度大小、對齊)產生最優機器碼,這點 inline/template 無法企及。以 VC6 實測其優化策略。
| 長度 | 生成指令模式 |
|---|---|
| 1 byte | mov cl, [src]; mov [dst], cl |
| 4 bytes | mov eax, [src]; mov [dst], eax |
| 8 bytes | 兩條 mov eax/edx |
| 19 bytes | 仍用 mov 逐塊搬移 |
| 20 bytes | 啟用 rep movsd(4-byte 塊) |
| 23 bytes | rep movsd + movsw + movsb 處理尾部 |
void foo(void *d, const void *s, size_t size) {
memcpy(d, s, size);
}
生成碼:rep movsd 處理 4-byte 塊,and ecx, 3 / rep movsb 處理餘數。
memcpy(d, s, size * 4); // size 為元素個數
編譯器直接產生純淨 rep movsd,無尾部處理,指令最精簡。
memcpy,讓編譯器自動最佳化。count * sizeof(T))。