2011-03-16 48 views
0

如果您的編譯器實際上只優化每個函數的兩個寄存器變量的訪問時間,那麼以下程序中的哪兩個變量最適合作爲寄存器變量?哪個變量應該在以下C代碼中進行優化

void main(void) 
{ 
    int i,j,k,m; 
    do 
    { 
    printf("enter value"); 
    scanf(「%d」,&i); 
    m=0; 
    for(k=0;k<100;k++) 
     m=k+m; 
    } 
    while(i>0); 
} 

請忽略如有錯誤是有...

+4

拼出「你的」,「這個」,「是......」有多難? – 2011-03-16 13:01:04

+0

請不要在自然語言中「優化」單詞。 – 2011-03-16 13:02:38

+2

另外,我不能簡單地忽略'void main'錯誤。 – 2011-03-16 13:03:27

回答

4

當然不是j,因爲它從來沒有使用過。不是i,因爲您正在使用address-of運算符來寫入它,這意味着它在被scanf寫入之後需要從內存中讀回。那隻剩下km

+0

+1對於實際給出正確和明智的答案。 – 2011-03-16 14:15:09

+0

@Jim謝謝你:-) – Jonathan 2011-03-16 14:16:32

+0

一些「答案」討論了優化'm'的計算,但是這只是不回答這個問題,它並沒有說明編譯器是這樣做的優化,它只會詢問哪些變量會被放入寄存器中。這個問題有點愚蠢,因爲它很容易回答,但它確實測試了一些基本技能,包括理解問題的能力。 – 2011-03-16 14:26:59

2

我猜編譯器會挑選k和m

+2

如果您爲您的猜測提供了一些理由或基礎,這個答案會更有用。 – 2011-03-16 13:15:09

+0

是的是的...我的經驗法則是假設內部大多數變量是最有利於優化(因此我的答案)。但我知道生活遠非如此簡單......例如,我知道一些編譯可能會優化m = 5950的內部(就像其他人所說的那樣) – SteelBytes 2011-03-16 13:20:11

+1

爲什麼人們對這種可憐的答案滿意? a)如果你必須猜測,你應該讓*不*猜測的人給出答案。 b)你顯然沒有時間或想法,因爲k和m是唯一可能的答案。 – 2011-03-16 14:14:01

3

良好的編譯器會優化這部分代碼:

m=0; 
for(k=0;k<100;k++) 
    m=k+m; 

並用m = 4950;替換它:) 更好的將優化m = 4950;,並沒有放置任何東西)。 j也會被優化。而i不能註冊,因爲在scanf其地址是必需的。所以最終的答案是「沒有人」。

+2

您不能將'i'放入寄存器,因爲'scanf'正在被傳遞給它的地址。 – Jonathan 2011-03-16 13:09:48

+0

@Jonathan同意) – 2011-03-16 13:15:23

+0

如果你同意,那麼你知道你的回答是錯誤的,你應該刪除它或編輯它是正確的。 – 2011-03-16 14:19:14

5

詭計問題?在智能編譯器中,沒有任何變量被註冊。 i的地址已被佔用,所以它不能一直在寄存器中。 j,km應該被優化掉。

1

由於從不使用計算結果,編譯器可以優化出幾乎所有的代碼。正如其他人已經表示,必須保持的唯一的東西相當於

int main(void) { 
    int i; 
    do { 
    printf("enter value"); 
    scanf(「%d」,&i); 
    } while(i>0); 
    return 0; 
} 

僅存的可變i因爲它的地址是不能register存儲類的。