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