2013-03-02 60 views
0

我有以下功能驅動程序:堆棧消費範圍的局部變量

function MyFilter() 
{ 
    bool PassThrough = true; 

    if (<some condition>) 
    { 
     PassThrough = false; 
    } 

    if (PassThrough) 
    { 
     // some local stack variables //Locals #1 
     IofCallDriver(); 
    } 
    else 
    { 
     // more local stack variables //Locals #2 
     NonPassThroughWork(); 
    } 
} 

我的查詢:

當上述驅動函數編譯(使用MSFT C++編譯器),多少會在堆棧由於局部變量導致的消費? 'MyFilter'的局部變量堆棧大小是否反映了由於內部作用域(即本地#1,#2)中定義的大小而引起的大小?

回答

0

也許最好檢查一下生成的程序集。我本來以爲當地人遇到的最糟糕的堆棧大小是MAX(sizeof(#1),sizeof(#2)) + sizeof(PassThrough)。儘管取決於優化,但可能更少。例如,如果PassThrough是不是在使用的第一個if後「活」,那麼它可能只是駐留在註冊等...同樣爲其他變量,註冊着色。也許編譯器讓其他優化太...

見查看裝配

How to view the assembly behind the code using Visual C++?

我覺得經歷的裝配會給您最準確的回答你的問題:)

0
以下

局部變量和所需的功能執行一切堆棧空間在編譯時被保留,因此是否真的需要這個空間,即相應的條件評價爲真,無所謂(而實際上沒有在這一點上已知的) 。 編譯器通常會分配函數入口,包括所有本地變量空間和函數調用的空間,即輸入參數,返回地址和返回值所需的函數的棧消費的完整的存儲空間。

看一下反彙編代碼應該給你相同的答案,你通常會發現一個操作的字節的具體數量在函數的最開始的地方擴展堆棧幀。在使用gcc的32位機器上,它會像sub esp, 32