「靜態函式被分配在一直使用的儲存區,直到退出程式,避免了呼叫函式時壓棧出棧,速度快很多「 對麼?

時間 2021-06-03 18:44:23

1樓:sunwake

首先說結論:純扯淡;

在說驗證過程:

我們知道,在函式的逐級呼叫的過程中,引數、區域性變數、返回位址等是逐級壓棧的。

如果靜態函式棧被分配在乙個單獨的儲存區,那麼,靜態函式中區域性變數的位址,必然跟caller callee中的變數的地不連續,我們可以寫乙個測試程式測一下

如你所見,區域性變數位址並沒有不連續。

PS:有時候查資料真不如動手測一下。

2樓:暮無井見鈴

就 C/C++ 來說,題主引用的這段話是全錯的。

static 函式和非 static 函式放在記憶體的同一類區域。所有函式在記憶體中的生存期都是整個程式執行期。內聯的函式才是避免壓棧的。

可以用 inline 修飾來提示編譯器內聯,但 inline 不是強制的,有時編譯器也會自動把可內聯的較短函式內聯。static 函式壓棧和非 static 幾乎無區別,僅有區別是類成員函式若為 static ,則壓棧時不會傳遞 this 指標。

C++ 的話 static 兩種用法。一種修飾的不是類成員,另一種修飾的是類成員。 C 只有前一種。

非類成員的 static 函式本質上和其他函式完全相同。只是這些函式僅屬於當前檔案,不能為其他檔案通過 extern 使用。

假如某個變數用 static 修飾,則其生存期是整個程式執行期,與全域性變數放在同一儲存區。但只能在當前函式(區域性變數)或當前檔案(全域性變數)中使用。若函式使用了遞迴,則 static 修飾的區域性變數在遞迴的各層中都是同乙個實體。

類成員的 static 變數與非類成員的靜態區域性變數有共通之處——不同類例項的同名靜態成員都是同一實體,分配在全域性變數的儲存區。

故而靜態成員變數是不需要類例項的變數,只屬於類而不屬於具體例項,可以通過類名::變數識別符號的方式訪問。

static 修飾的類成員函式則與靜態成員變數有共通之處——只屬於類而不屬於具體例項,但和非類成員的 static 函式關係不大。

無論 static 的有無,類成員函式在記憶體中都只有乙份。非 static 成員函式在呼叫時會自動隱式帶上類例項位址的引數(this 指標),而 static 成員函式沒有這個引數。

可以認為非 static 成員函式也不是「專屬於」類例項的,只是會與類例項建立關聯(通過 this 指標引數)罷了。

static 在修飾變數的時候確實有「靜態」的意思——生存期為整個程式,儲存位置固定。

但修飾非類成員函式的時候,意義就變成了 static 變數實際特徵的引申義——有全域性之實、區域性之名。

到了類成員函式時,意義則變成了 static 類成員變數特徵的引申義——屬於類而不屬於例項。

3樓:沙耶里

我猜測這裡說的靜態函式指C++的static函式,但應該是對函式呼叫的過程有所誤解。

在編譯原理的課本上講Runtime Environment時說對於Stack based的編譯器實現中,函式體是和靜態變數一樣儲存在棧區之前的靜態儲存區的,但不論如何,函式呼叫時都要進行壓棧(將實參,函式中的區域性變數,函式指標,返回指標一系列資料作為乙個函式呼叫壓棧)。但函式體本身不會包含在這個函式呼叫當中,而是以函式指標的形式引用。

如果如他所講的靜態函式呼叫時不需要壓棧的開銷,那麼函式的引數,區域性變數應該和函式體在同一位置存放,如此的靜態函式將不可能支援遞迴,不太合理。

如果他指的是將函式體壓入棧區的開銷,這部分開銷本來就不存在,也不合理。

綜合來說我覺得這句話的理解還是不太正確的。

4樓:事不過刪

我覺得這個說的是編譯時的自動優化,編譯優化時static函式會被當成內聯函式一樣編譯,當然就省了函式呼叫的開銷。但所謂一直使用的儲存區是什麼東東,就理解不能了。

5樓:Tim Shen

我這是二手知識。一手的在這:程式設計珠璣番外篇-D. 高階語言怎麼來的-1 4G spaces

幾十年前遞迴還沒有普及的時候在編譯時就將函式執行需要的空間(引數,區域性變數)分配在靜態儲存區是常態。缺點是沒動態棧函式沒法直接寫遞迴。那時候還不叫function,叫routine。

後來不知道哪路神仙,大概是Algol吧,率先用動態棧支援語言級別的遞迴,後來大家紛紛開始支援遞迴,靜態分配幀這事兒也就不提了。

直到最近C++出了個stackless coroutine。。。

6樓:依雲

從來沒聽過這種說法。「靜態函式」是什麼,宣告為「static」的函式麼?那個只影響 linkage 的。

呼叫函式時總是要按平台的要求進行處理的,不明白這裡的「壓棧出棧」指的是什麼。

簡單來說就是,完全不能理解這句話到底在扯啥。

keras 為什麼loss函式的值一直沒有太大變化?

aluea 瀉藥3755個類別也太頂了。一般的模型根本搞不定這麼難的任務。實踐上 我跑個識別3000個詞左右的語言識別,模型大的一匹,用了12層transformer四個節點八塊GPU才裝下,超算跑了三天三夜才將將收斂。而且我這個任務還有前後關聯資訊可以用,難度比你的小。你自己比較下。理論上 1.近...

一直用C C 等靜態語言,接觸到動態語言感覺好新奇好不適應怎麼辦?

劉縉 不適應嗎?其實你用了很長時間的動態型別語言,從小學開始。翻開你的數學課本,是 令x 1 f x x 1 還是令Z x 1 R f R x x 1 對於不是從靜態語言入門的人,動態型別其實是最自然的。 雪豐 穩和快的取捨?人太容易犯錯,靜態語言可以幫助程式設計師完善自己的不足,獲得完整的設計思路...

哪位一直被捧的明星你卻一直喜歡不起來?

像楊冪啊鄭爽啊感覺完全是通稿吹出來的,然後自己可能也信以為真了長期沉溺於立人設和人設崩塌無法自拔 並且真.沒演技,滿臉都是扎戲太多之後的疲憊和各種整容痕跡 空白人生 我能默默地提WWE裡面的羅曼雷恩斯嗎。在我看來,他真的算是WWE目前最力捧的超級巨星了,和rock一樣血統的出生,嚴峻冷酷的外表,無敵...