このVC++からの分解では、関数呼び出しが行われています。コンパイラは、ローカルポインタをプッシュする前にレジスタにMOVします。
memcpy( nodeNewLocation, pNode, sizeCurrentNode );
0041A5DA 8B 45 F8 mov eax,dword ptr [ebp-8]
0041A5DD 50 push eax
0041A5DE 8B 4D 0C mov ecx,dword ptr [ebp+0Ch]
0041A5E1 51 push ecx
0041A5E2 8B 55 D4 mov edx,dword ptr [ebp-2Ch]
0041A5E5 52 push edx
0041A5E6 E8 67 92 FF FF call 00413852
0041A5EB 83 C4 0C add esp,0Ch
直接プッシュしてみませんか?すなわち
push dword ptr [ebp-8]
また、別のプッシュを行う場合は、手動で行ってみませんか。つまり、上記の「push eax」を実行する代わりに、
mov [esp], eax
など、これの利点は、3回の移動を行った後、プッシュで3回暗黙的に減算する代わりに、1回の減算を実行して新しいスタックポインタを設定できることです。
更新---リリースバージョン
これは、リリース用にコンパイルされたものと同じコードです。
; 741 : memcpy( nodeNewLocation, pNode, sizeCurrentNode );
00087 8b 45 f8 mov eax, DWORD PTR _sizeCurrentNode$[ebp]
0008a 8b 7b 04 mov edi, DWORD PTR [ebx+4]
0008d 50 push eax
0008e 56 push esi
0008f 57 push edi
00090 e8 00 00 00 00 call _memcpy
00095 83 c4 0c add esp, 12 ; 0000000cH
デバッグバージョンよりも間違いなく効率的ですが、それでもMOV/PUSHコンボを実行しています。