關於C++中指標和引用的速度
想寫這篇博文的起因是某天突然有人問我,你知道C++中指標和引用有什麼差別嗎,我就按照我所以知道的嘰裡呱啦的講了一堆(其實也就是隨便拿本C++書都有說的那些),我講完後對方得意地說你沒講到重點,重點是引用要比指標快得多。我一聽傻了,說實話我從來沒想過這個問題,既然有人說了,那就自己動手來看看,真實的情況是什麼樣的。
環境:VS2008
通過反覆的執行這段程式的結果看,兩種呼叫方式的執行速度沒有什麼差異,基本一致。既然他們的執行速度基本一致,那麼讓我們來看看他們的彙編實現是否有什麼差異。
首先,我們來看看void Point(int *p);的彙編程式碼:
然後,是void Reference(int &r)的程式碼:
如果不懂得彙編的話也沒事,因為我們會發現在VS2008編譯出來的兩個函式的彙編程式碼是完全一樣的,這也就不難解釋前面所講到的他們的執行速度為什麼會基本是一致的。
既然兩個函式本身是一致,那讓我們來看看他們的呼叫程式碼是否有差別,一下是void main()的程式碼:
認真觀察下這段程式碼,就會發現對兩個函式的呼叫也是完全一致的。
具體的呼叫void Point(int *p)的幾句程式碼
013015B3 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30] ; eax = &a
013015B6 50 PUSH EAX
013015B7 E8 B5FCFFFF CALL PointAnd.01301271 ; void Point(int *);
具體的呼叫void Reference(int &r)的幾句程式碼
0130166E 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30] ; eax = &a
01301671 50 PUSH EAX
01301672 E8 FFFBFFFF CALL PointAnd.01301276 ; void Reference(int &);
至此,我們不僅從巨集觀而且從微觀上都確定了關於指標和引用誰的速度快這一問題,毫無疑問他們的速度上是沒有什麼大的差別的。這時又有一個疑問產生了,這個結果是用VS這個編譯器得出的結果,會不會其他的編譯起是其他的情況呢。對此,因為我電腦裡除了VS外就只有QT了,因此我用QT也做了相同的實驗,只不過傳進去的引數從簡單的int改為了QString,實驗結果依然與上述結果一致。