2010-10-17 75 views
1

我正在閱讀關於優化teckniks的書。例子中沒有太多的描述或建議。這裏的東西:C「靜態」優化

int agag(int a) 
{ 
    static int dfdfdf = 0; 
    static int prev_resilt = 0; 
    if (dfdfdf == a) 
    return prev_result; 
    dfdfdf = a; 
    a = SomeCalcs(); 
    prev_result = a; 
    return a; 
} 

關鍵是:如果參數是與以前的計算相同,它會立即返回以前的結果,避免了硬計算。 現在的問題是:這兩個靜態變量是否會一直存在,直到程序結束?據我瞭解,有很多這些是不好的事情?

我知道這並沒有太多的優化。但我只關心靜態變量的影響..

非常感謝您的答案!

+3

這種類型的優化只有在以下情況下才適用:(1)計算費用昂貴;(2)機會很高,可能會用相同的參數再次調用該函數。 – 2010-10-17 19:06:40

+0

請張貼本書的名稱/作者。 – 2010-10-17 19:49:24

+0

Harriet Gecks。優化C++ – Kane 2010-10-17 20:12:50

回答

8

靜態變量使用的內存將分配到數據段中而不是堆或堆棧中。當你有大量的靜態變量時,這隻會成爲一個問題,因爲這意味着可執行文件將不得不從磁盤加載更大的數據段。

但這種方法最大的問題是它只存儲一個值。如果您希望使用相同的輸入進行多次重複,則只需實施適當的memoization即可。

+0

太多本地變量會增加堆棧,本地全局變量(靜態)位於數據段中,因此更具可控性和可預測性。對於任何一種類型都必須同樣小心。 – 2010-10-17 19:38:51

0

是的,它們存在,直到你的程序結束。只要您確定輸入0a結果爲0,您就可以。

8

是的,static變量的生命週期是一直到程序結束。

但是,這樣做會將狀態添加到您的函數中。這使得它非線程安全,更難調試,並且更難以測試。這些通常被認爲是不好的事情。

0

你忘了指定dfdfdfa,以及其他小錯誤。

是的,這兩個變量會在程序的整個生命週期中佔用內存,就像它們是全局變量一樣。他們可能會使用8個字節。功能agag的代碼佔用了更多的空間,並且直到程序結束時纔會被回收。你爲什麼不擔心呢?

+0

該代碼不佔用運行時存儲空間,因爲內存中的副本與文件系統緩存中的副本一致,並且可以隨時丟棄和重新加載......更不用說它在進程間共享。這與數據非常不同。 – 2010-10-17 19:04:27

+0

是的,對不起。原始代碼有點不同。我只專注於「新」結果部分,完全忘記恢復dfdfdf = a; – Kane 2010-10-17 19:09:37