2015-07-11 65 views
0

爲什麼在舊編譯器中使用前綴增量運算符而不使用後綴運算符是不好的做法?根據我的理解,現代編譯器對此進行了優化,但舊編譯器卻沒有。是否有一個特定的原因,其中一個比另一個慢,並且它是在編譯代碼中保持優化的原因? 如果您可以提供有關操作員和編譯器的任何其他詳細信息,我將不勝感激,謝謝有關增量運算符的C++編譯器問題

+6

是否有參考*是不好的做法使用前綴增量運算符與舊編譯器*後綴運算符? –

+3

相關問題和答案:http://stackoverflow.com/questions/17436141/kr-seems-to-prefer-pre-increment/17458012#17458012 – Jens

+1

你真的想說'++ p'是*糟糕嗎?比'p ++'?通常沒有區別或(在特定情況下,例如使用重載操作符)「p ++」更慢。 – dlask

回答

3

「老」你一定是非常老。

原因在於,在真正優化之前的日子裏,C/Unix開發的主要系統是PDP-11和後來的VAX-11。 PDP和VAX具有預遞減和後遞增尋址模式。然後

MOVL R0, -(R1) ; Decrements R1 by 4 and move the value of R0 to that location. 
    MOVL (R1)+, R2 ; Move the value at R1 to R2 then add 4 to R1. 

這些應該是C相當於

*(--a) = b ; 
    b = *(a++) ; 

在小優化的日子,這些很容易被映射到底層彙編指令。

同時這些尋址方式不存在做相反:

MOVL (R0)-, R1 
    MOVL +(R0), R1 

因此,沒有硬件映射到

*(++a) = b ; 
b = *(a--) ; 

的 - (Rx)和(Rx)的+尋址模式可以輕鬆實現向下堆疊。