請問C 函式的區域性變數和引數哪個先被刪除?

時間 2021-06-06 18:51:40

1樓:徐聖

C param

讀讀它你就明白了:區域性變數先滾蛋,引數其實是在呼叫者的棧上呢,最後銷毀。怎麼定址到引數呢,棧幀基址往高位址加就行了。

其實GCC最後一步銷毀引數一般都省略不做,因為下次使用到這塊記憶體時會覆蓋掉了。

2樓:旺旺

根據C++ 2003標準文件第5.2.2節第4項的規定:

引數的構造與析構發生於此函式的呼叫者的上下文之中,而不是這個函式的上下文。

所以再根據,函式之內的區域性變數的構造與析構發生在這個函式的上下文裡,然後函式結束之後才能返回其呼叫者的上下文。所以推定:函式內的區域性變數的析構一定發生在其引數析構之前。

3樓:何波

反彙編一下就很清楚了。這裡需要搞清楚函式呼叫和區域性變數是怎麼分配的。

呼叫函式的時候,引數是通過push進去的。比如int a = sum(n);

那就是push n

call sum

mov eax, a

在函式內部區域性變數的分配就是直接減棧頂指標,比如有2個int型別的變數

sub esp, 2*4

退出函式前 ret esp, 2*4,就把區域性變數刪了。

然後再出來刪掉引數。

C 函式返回區域性變數的std move 問題?

BinGostar 我理解的是 避免拷貝 和move是兩個東西 避免拷貝 是編譯器的優化方式,move是告訴編譯器按照移動語義函式去執行來避免拷貝 當然大多時候,不管是否使用move,編譯器都會優化來避免拷貝clang很人性,告訴你這是不必要的,g 不管那麼多,一把梭有時候以為自己程式設計技術的突飛...

c 用new開闢到堆區的區域性變數的指標可以返回嗎?

可以,但是不方便。因為這意味著釋放記憶體的責任丟給了呼叫方。每個呼叫方都得記得用完之後釋放記憶體。一旦忘記就是記憶體洩露。這可不是什麼好事。另外,大部分常見的類似需求都已經被STL裡面的容器承包了。生產環境下面應該優先考慮他們。 阿莫小西林 首先需要明確乙個概念,區域性變數是位於棧區的,new出來的...

區域性變數和全域性變數對程式效率會有影響嗎?

小小小Kiss 效能能不能提公升不清楚,得看編譯器是否會對這個做優化。但程式自身出問題的可能性會很大,因為變數管理難度太大了。程式的安全性,挑戰也很大,因為不受控因素太多,黑客們可以在你想不到的地方對你進行攻擊,而不侷限於函式所在的堆疊。 恰恰相反,對於基本型別的變數,使用區域性變數往往會比全域性變...