補遺篇之static

2021-06-19 16:50:39 字數 1113 閱讀 6470

static的作用是it公司c語言筆試必考題,看似簡單卻少有人能完整回答。因為它不止乙個作用,並且隨修飾物件的不同而變化,這裡我總結成「有限生命變無限,無限空間變有限」。

static有三類作用物件:函式、區域性變數和全域性變數。其中區域性變數只在函式執行期間存活,即「有限生命」;而函式和全域性變數的作用域是無限的,也就是「無限空間」。

1)「有限生命變無限」是指static可以延長區域性變數生命週期。c語言區域性變數存放在棧中,其有效時間從函式呼叫時開始,到函式退出完成出棧操作後截止,所以它們的生命是有限的。但如果把函式內某區域性變數用static修飾,該變數在函式多次呼叫過程中就能記住原來的值,它的生命週期不再是短暫的一次函式呼叫,而是擴充套件到整個程式執行週期。因此統計乙個函式被呼叫多少次或檢測它是否被首次呼叫,就經常使用static區域性變數。如:

void testfun()

這個函式只有首次呼叫時,static變數fun_cnt才為0,以後每次呼叫,變數值都遞增,而如果fun_cnt是普通區域性變數,函式結束後原本儲存的值就丟掉了,以後每次都從0開始。而static變數之所以具備這種記憶功能,是因為它不再象普通區域性變數那樣存放在棧裡,而是存在全域性資料區,和全域性變數的儲存位置相同,所以函式進出棧的操作對它沒有影響。

2) 「無限空間變有限」又是什麼意思?c中全域性變數和函式的作用空間預設是全域性的(函式也可看作全域性變數)。既然名稱全域性可見,重名的可能性必然增加(」命名汙染」),static此時可以起到一定限制作用。

全域性變數和函式如果被static修飾,它們將不能被其他原始檔訪問,而只能在所處原始檔內被呼叫。也就是說,static能把全域性作用域限制到「本地」原始檔裡,以防止全域性命名的衝突。可以這樣理解其機制:static變數或函式,編譯後生成的符號前會加上所在檔案的檔名作字首,這樣鏈結時,因為檔名不同,就不會和其他檔案裡的同名變數衝突。

除以上兩點之外,用static修飾函式有時還能附帶提高程式執行效率:編譯器會把短小的static函式自動內聯展開,以消除函式呼叫開銷。這種智慧型操作的依據之一就是:static函式只能被本地檔案內的函式呼叫,展開也不會影響其他檔案的編譯和整體鏈結。

總結:static是對c固有問題(全域性命名汙染與區域性變數短生命週期)的修補。對所有不需在其他原始檔中使用的函式與全域性變數都應用static修飾,有益無害。

補遺篇之單行道標誌const

面試時,問及const的含義,很多人會答 const表示常量 這可不是考英文翻譯,const應該更近似 唯讀 而不是常量。const語法 對非指標變數,const無論放在型別前或後,都表示變數屬性為唯讀,執行過程中不能也不會賦值修改。如const int a 和int const a 這兩種方式co...

Openmp補遺之同步

指定特殊的儲存單元將被原子地更新,不允許多個執行緒同時執行更新操作。如果不寫,其結果將不可預料。謹之慎之 臨界區宣告方法 pragma omp critical name 表示名字可選 critical與atomic的區別在於,atomic僅適用於上一節規定的兩種型別操作,而且atomic所防護的僅...

Openmp補遺之同步

指定特殊的儲存單元將被原子地更新,不允許多個執行緒同時執行更新操作。如果不寫,其結果將不可預料。謹之慎之 臨界區宣告方法 pragma omp critical name 表示名字可選 critical與atomic的區別在於,atomic僅適用於上一節規定的兩種型別操作,而且atomic所防護的僅...