2014-10-16 84 views
0

以下程序的執行什麼是綁定在一個時間在堆棧變量的最大數量時:如何找到變量的最大數量在堆棧

int x, y, z; 

int g(int a, int b) { 
    int c = 5 * a + b; 
    return c; 
} 

int f(int a, int b) { 
    a = g(a, 5); 
    return g(b, a); 
} 

int main() { 
    int a, b, c; 
    x = y = z = 0; 
    a = 5; b = 6; 
    c = f(a, b); 
    printf("%d", c); 
} 

如果有誰知道請如何發現。你能解釋我該怎麼做才能在每個可能給出的代碼中找到它。 沒有任何優化。

又如:

int x,y; 

int f(int a){ 
    if (a!=5) 
    return f(--a); 
    else 
    return a; 
} 

int main(){ 
    int a,b; 
    a=8;b=6; 
    x=f(a); 
    y=f(b); 
    printf("%d", x+y); 

    return 0; 
} 

這是答案6以上?因爲第一次返回,返回一個變量3次..第二次返回一次返回一個數字,我們有兩個變量在主要所以6?

+0

@Ilya我認爲根據您的約定編輯代碼可能不是最好的事情,並且不遵循SO規則。 – tomsoft 2014-10-16 10:23:14

+0

@tomsoft,感謝您的反饋!我會再讀一遍SO規則。 (對我來說,很難閱讀問題的初始版本,所以我決定改進它,但可能是錯誤的決定,謝謝!) – Ilya 2014-10-16 10:25:56

回答

1

這取決於編譯器和優化設置。好的優化算法會產生如下的結果:

int main() { 
    printf("%d", 155); 
} 

其他算法會產生別的東西。所以,嘗試使用反彙編器來編譯結果。

+0

@cbegi,所以你可以認爲沒有任何優化。他們只是檢查你是否瞭解什麼是堆棧。 – Ilya 2014-10-16 10:27:29

+0

是的,你可以幫我嗎?向我解釋堆棧中保存了哪些變量? – cbegi 2014-10-16 10:28:44

+0

你讀過關於棧上變量的東西嗎?我們需要知道你懂什麼來解釋其他事情。 – Ilya 2014-10-16 10:34:40

2

您可以在您的腦海中(或在調試器中)一步一步地運行程序,並且可以計算call stack每幀中的所有活動變量(然後獲取它們的最大和)。

在您的具體示例中,假設沒有進行優化,最深層調用堆棧發生在greturn c;語句中,f調用main。因此,我們有3個變量3個調用棧幀爲gabc;!我假設甲縮醛就像局部變量,這並不總是正確的做法),2個變量fab),和main有3個變量。

您的老師可能希望您在最深的狀態下繪製調用堆棧。我把它留給你。

實際上,一些變量不會佔用任何堆棧空間,例如,因爲他們坐在一個寄存器中,或與另一個變量共享一個棧槽。這是編譯器和ABI以及特定於處理器架構和操作系統。

但是,作爲Ilya answered,一個好的編譯器會將您的程序轉換爲optimization purposes,所以實際上答案可能不同。

如果使用GCC,您可以嘗試在生成的彙編代碼看(使用gcc -fverbose-asm -S),你會看到結果和使用的變量的數量取決於優化參數(即-O1-O2等。或缺乏它們)。您也可以使用GCC特定的-fstack-usage標誌。您甚至可以嘗試使用-fdump-tree-all標誌gcc,該標誌給出了數百個轉儲文件,詳細說明編譯器內部程序的各種中間表示(Gimple,SSA,...)。

閱讀也wikipages上continuations(也可能是call/cc),tail callrecursioninline expansion

順便提一下,C99標準所要求的調用堆棧的存在並不是嚴格意義上的(但我知道沒有實現C不使用任何調用堆棧)。如果你很好奇,你應該閱讀A.Appel的舊論文garbage collection can be faster than stack allocation(它解釋了SML不使用任何調用堆棧的實現,因爲它正在垃圾收集堆中分配每個「調用幀」,也就是「連續幀」)。

我也建議編譯你的例子(用gcc -Wall -g)然後在gdb調試器中運行它們一步一步。經常使用display,step,backtrace,framecommandsgdb

+0

好的,你能解釋一下這個案子的答案嗎? – cbegi 2014-10-16 10:30:17

+0

@Basile,謝謝你的這些鏈接! – Ilya 2014-10-16 10:43:18

+0

然後你應該在紙上繪製*演變*調用堆棧,或者在板上用粉筆繪製更好的*。我記得去年在大學(巴黎第6期,計算機科學碩士)完成了那個 - 階層3的遞歸實現 - 遞歸實現的電路棧。我花了20分鐘。 – 2014-10-16 10:48:00