2010-01-30 24 views
15

我有點好奇如何這是不存儲在變量C和C++處理數據,e.g:C(++)對未存儲在變量中的值做什麼?

int IE6_Bugs = 12345; 
int Win_Bugs = 56789; 

呀 - 一切都清楚了。 IE6_Bugs已將123456存儲在其特定的內存地址中。

那麼關於..

if (IE6_Bugs + Win_Bugs > 10000) 
{ 
    // ... 

所以C抓住兩個變量的值,並將它們以比較的結果到右邊的int值。

但是:

  • 是否IE6_Bugs+Win_Bugs曾經達到RAM?還是處理器直接通過自己的緩存比較值?

  • 或者,在編譯過程中,上面的if語句被轉換爲更容易理解的機器? (也許計算IE6_Bugs+Win_Bugs第一,並將其​​存儲在某個變量,...)

+0

int your_Bug =假設INT_MAX大於32768. – MSalters 2010-02-01 12:37:03

+0

所以Win_Bugs結束了INT_MAX - 問題在哪裏? ^^ 正如您可能已經看到的,我已選擇123456789作爲示例數字。 – lamas 2010-02-01 13:36:41

回答

18

它會被放置在一個寄存器中的CPU中(如果可用)。寄存器是一種超高速超小型RAM,內置於CPU本身,用於存儲中間操作的結果。

如果可以確定該值始終等於xxx,那麼智能編譯器將替換xxx的值代替它。請記住,無論它是表達式還是數字(x + y vs 10),它都會將仍然需要放置在寄存器中,以便CPU可以訪問它並執行操作根據其價值。

欲瞭解更多信息,請閱讀計算機體系結構。

+1

那麼如果它不適合註冊呢? – abenthy 2010-01-30 15:25:58

+0

@abenthy:它在堆棧上,然後.. – Macke 2010-01-30 15:38:17

+1

那麼,這取決於CPU架構。一些CPU只能讀/寫寄存器,並且無法訪問內存和堆棧。在這種情況下,其他的東西就會從寄存器移到內存上,並將其置於原來的位置。 :-) – 2010-01-30 15:44:31

8

在一般情況下,代碼生成器直接在指令中編碼這些值(「立即模式尋址」)或將它們存儲在程序的數據段中以根據需要加載。

稱爲「常數摺疊」的優化在編譯時計算常量表達式的值。在您的特定示例中,智能編譯器會識別出您的條件始終爲真,並避免爲測試生成代碼,因此12345,56789和10000的值可能完全不會在爲您的程序生成的機器代碼中表示。

您的編譯器可能有一個選項來保留爲您的程序生成的中間彙編語言,例如g++ -S。瞭解一下你的處理器的體系結構和彙編語言,學習如何從這個輸出中理解甚至是有用的推論。

4

它放置無名的臨時值,無論它放置命名變量 - 通常在堆棧上。和命名變量一樣,編譯器可以選擇將值放在CPU寄存器中以加快速度。如果你真的對此感興趣,你應該看看編譯器生成的彙編輸出。

+0

這將是一個好主意,謝謝 – lamas 2010-01-30 14:03:20

4

好吧,一個好的編譯器會做不斷的傳播和摺疊,所以在這個例子中,它會用123456和Win_Bugs替換掉IE6_Bugs和56789,然後將其轉換爲69134.然後,它可能還會將69134> 10000 'true'並在編譯時全部刪除該分支。

至於在哪裏存儲表達式的結果,如果它沒有進行常量傳播或摺疊,或者存儲位置或寄存器。寄存器將會快得多。

2

絕對沒有辦法確定地回答這個問題。這裏的其他答案對於大多數體系結構都是準確的,但這不是硬件不可知的C/C++標準所規定的。

評估順序由標準定義。如何最終在內存中處理事情並非如此。

0

說明的方法是檢查生成的彙編代碼,或者在調試器中對其進行檢查。不同的編譯器可能以不同的方式做到這一點。它也可能取決於您的編譯器選項,如「DEBUG」。

如果聲明的前綴爲「const」,那麼關於常量摺疊和消除「if」測試的註釋將適用。