C 語言,「static 函數在內存中只有一份,普通函數在每次調用中維持一份拷貝」,這話怎麼理解?
08-09
樓主看的書可能有點扯淡。
static這個關鍵詞,在c裡面有兩種意思。(1)
一個是,用在函數的裡面,給予函數一種有記憶的狀態。void f(){
static int a=1; //不論被調用多少次,只會被初始化一次。 // 這個a可以作為這個函數的狀態變數}不僅在c裡面有這種用法,c++裡面也有。
(2)
不過,按照樓主的說法,你想要問的情況應該是static的第二種含義。這種用法在c++裡面是不建議使用的,因為這第二種用法,和static這個英文單詞不太符合。在c裡面用得比較多。第二種含義表示的是internal linkage.這主要是因為c裡面,沒有namespace的概念,需要用這個來構造一種和namespace的隔離效果等效的東西。
簡單地說來。
現在假如有下面三個文件://file1.c
int f(int); // 聲明為 extern linkage ,與 extern int f(int); 是等價的。int f(int i){//...//這裡函數的具體實現}//file2.c
static int f(int); //聲明為internal linkage
int f(int i){//...// 這裡是函數的具體實現}//file3.c
int f(int);int main(){ f(1); // 調用 f(int)return 0;}
現在,分別編譯3個文件,得到:file1.o file2.o , file3.o你想要得到一個程序,比如,windows下面,一個exe,你需要鏈接(link)。
那麼,這裡你可以得到兩個不同的程序。一個程序,必須要有main函數,所以,file3.o是必選的。(1)
link file1.o 和 file3.o那麼,file3 中想要引用一個函數,int f(int ),真的在file1.o里找到了。鏈接成功,你能夠得到一個exe。
(2)link file2.o 和 file 3.o會失敗。你可能覺得,鏈接器應該能在file2.o中也找到file3.o需要的 int f(int )啊?具體實現我不清楚。但是,結果就是拒絕鏈接了。一般的提示是,鏈接器找不到f私以為:
static修飾函數就只是改變了該函數的作用域(只能在該文件內可見),其它和普通函數沒區別。至於題主的問題,看不懂,坐等高人解答。
static 和 inline沒啥關係。static 做為一個關鍵字,只是說這個函數不可外部鏈接而已,在運行時和普通函數一樣一樣的...Dont throw out your book yet.
For regular functions, all the variables are stored on stack. So each time you call the function, you get a fresh new copy of that variable. i.e, the variable space is allocated at run time.
However, for static function.variable, its space is pre-allocated in code or data section during compile time. You have only 1 copy of this variable even the correspondent function is never called.
我怎麼覺得剛好相反?普通函數在內存中只有一份,satic函數在每次調用中維持一份拷貝&!
推薦閱讀:
※如何深入學習C++?
※PS教程:創建一個James White風格懷舊海報
※c語言初學者,接下來的路該怎麼走?
※how to 製作ps仿古風棉麻版