找出爲什麼會有差異的好方法是檢查反彙編。下面是我在我的機器上得到了與Visual Studio 2012
隨着優化標誌的結果,這兩個函數生成相同的代碼:
009D1270 57 push edi
009D1271 FF 15 D4 30 9D 00 call dword ptr ds:[9D30D4h]
009D1277 8B F8 mov edi,eax
009D1279 FF 15 D4 30 9D 00 call dword ptr ds:[9D30D4h]
009D127F 8B 0D 48 30 9D 00 mov ecx,dword ptr ds:[9D3048h]
009D1285 2B C7 sub eax,edi
009D1287 50 push eax
009D1288 E8 A3 04 00 00 call std::operator<<<std::char_traits<char> > (09D1730h)
009D128D 8B C8 mov ecx,eax
009D128F FF 15 2C 30 9D 00 call dword ptr ds:[9D302Ch]
009D1295 33 C0 xor eax,eax
009D1297 5F pop edi
009D1298 C3 ret
這基本上等同於:
int main()
{
clock_t start, stop ;
start = clock() ;
stop = clock() ;
cout << "time: " << stop - start ;
return 0 ;
}
無優化標誌,你可能會得到不同的結果。
功能(不優化):
00114890 55 push ebp
00114891 8B EC mov ebp,esp
00114893 81 EC C0 00 00 00 sub esp,0C0h
00114899 53 push ebx
0011489A 56 push esi
0011489B 57 push edi
0011489C 8D BD 40 FF FF FF lea edi,[ebp-0C0h]
001148A2 B9 30 00 00 00 mov ecx,30h
001148A7 B8 CC CC CC CC mov eax,0CCCCCCCCh
001148AC F3 AB rep stos dword ptr es:[edi]
001148AE 8B 45 08 mov eax,dword ptr [ptr]
001148B1 8B 08 mov ecx,dword ptr [eax]
001148B3 6B C9 05 imul ecx,ecx,5
001148B6 8B 55 08 mov edx,dword ptr [ptr]
001148B9 89 0A mov dword ptr [edx],ecx
001148BB 5F pop edi
001148BC 5E pop esi
001148BD 5B pop ebx
001148BE 8B E5 mov esp,ebp
001148C0 5D pop ebp
001148C1 C3 ret
函數2(不優化)
00FF4850 55 push ebp
00FF4851 8B EC mov ebp,esp
00FF4853 81 EC C0 00 00 00 sub esp,0C0h
00FF4859 53 push ebx
00FF485A 56 push esi
00FF485B 57 push edi
00FF485C 8D BD 40 FF FF FF lea edi,[ebp-0C0h]
00FF4862 B9 30 00 00 00 mov ecx,30h
00FF4867 B8 CC CC CC CC mov eax,0CCCCCCCCh
00FF486C F3 AB rep stos dword ptr es:[edi]
00FF486E 8B 45 08 mov eax,dword ptr [val]
00FF4871 6B C0 05 imul eax,eax,5
00FF4874 89 45 08 mov dword ptr [val],eax
00FF4877 5F pop edi
00FF4878 5E pop esi
00FF4879 5B pop ebx
00FF487A 8B E5 mov esp,ebp
00FF487C 5D pop ebp
00FF487D C3 ret
爲什麼是按值傳遞更快(在沒有優化的情況下)?
那麼,function()
有兩個額外的mov
操作。讓我們來看看第一個加mov
操作:
001148AE 8B 45 08 mov eax,dword ptr [ptr]
001148B1 8B 08 mov ecx,dword ptr [eax]
001148B3 6B C9 05 imul ecx,ecx,5
在這裏,我們取消引用指針。在function2()
,我們已經有了價值,所以我們避免了這一步。我們首先將指針的地址移動到寄存器eax中。然後我們將指針的值移到寄存器ecx中。最後,我們將該值乘以五。
讓我們看看第二個加mov
操作:
001148B3 6B C9 05 imul ecx,ecx,5
001148B6 8B 55 08 mov edx,dword ptr [ptr]
001148B9 89 0A mov dword ptr [edx],ecx
現在,我們在倒退。我們剛剛完成了將該值乘以5,並且我們需要將該值放回到內存地址中。
由於function2()
不必處理引用和取消引用指針,它會跳過這兩個額外的mov
操作。
你可能想讀這個:[想要速度?按值傳遞](http:// cpp-next。com/archive/2009/08/want-speed-pass-by-value /) – Angew
這兩個函數的行爲是不一樣的,所以它不是一個公平的比較......(另外,你傳遞一個指針,而不是C++參考...) –
'function2' does * nothing *,因此它可以完全從機器代碼中省略。 –