static關鍵字的作用【C語言、C++、linux中的作用剖析】

一、C語言中static關鍵字的作用

在C語言中,static關鍵字主要有以下作用:

1、static修飾變量會延長局部變量的生命週期

當static修飾變量的時候,變量會被存儲在靜態區,存儲出在靜態區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化,直到程序運行結束以後才進行變量釋放。

2、static修飾的全局變量或者函數具有隱藏特性

我們都知道,當同時編譯多個文件時,全局變量或者函數都具有全局可見性,當我們爲了提升效率和程序安全性考慮時,可以在全局變量或者函數前加上static前綴,這樣該全局變量或者函數只能在本文件中被訪問,不能在其它文件中訪問,即便是extern外部聲明也不可以。

3、在函數體內,個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變(該變量存放在靜態變量區)。

靜態變量屬於靜態存儲方式,其存儲空間爲內存中的靜態存儲區,該區域中的數據在整個程序的運行期間一直佔用這些存儲空間(在程序整個運行期間都不釋放)。靜態變量並不是說其就不能改變值,其擁有的值是可變的,它的最重要的特點是它會保持最新的值,在整個程序執行期間,一旦修改靜態變量的值,它的值就會得到更新……這樣直到整個程序結束。說其靜態,是因爲它不會隨着函數的調用和退出而發生變化。即上次調用函數的時候,如果我們給靜態變量賦予某個值的話,下次函數調用時,這個值保持不變。靜態變量雖在程序的整個執行過程中始終存在,但是在它作用域之外不能使用,也就是說,對靜態變量的修改只在它的作用域中纔可以。

4、static的默認初始化是0

在靜態數據區,內存中所有的字節默認值都是0x00,某些時候這一特點可以減少程序員的工作量。比如初始化一個稀疏矩陣,我們可以一個一個地把所有元素都置0,然後把不是0的幾個元素賦值。如果定義成靜態的,就省去了一開始置0的操作。再比如要把一個字符數組當字符串來用,但又覺得每次在字符數組末尾加’\0’太麻煩。如果把字符串定義成靜態的,就省去了這個麻煩,因爲那裏本來就是’\0’。因爲全局變量也存儲在靜態區,其默認初始化也爲0。

5、空間釋放問題以及安全性可以考慮static

(1)棧空間不想被釋放的時候,可以使用static修飾。比如修飾函數中存放在棧空間的數組。如果不想讓這個數組在函數調用結束釋放可以使用static修飾
(2)考慮到數據安全性(當程想要使用全局變量的時候應該先考慮使用static)

二、在C++中static的作用

在C++中,static除了包含C語言中的static的作用外,還具有以下特性:

1、static用來修飾靜態數據成員

(1)靜態數據成員可以實現多個對象之間的數據共享,它是類的所有對象的共享成員,它在內存中只佔一份空間,如果改變它的值,則各對象中這個數據成員的值都被改變。
(2)靜態數據成員在程序運行時分配空間,在程序執行結束後釋放空間,只要類中有靜態數據成員,即使沒有定義對象,也會給靜態數據成員分配內存空間
(3)靜態數據成員只能在類外初始化,默認初始化值爲0
(4)靜態數據成員既可以通過類對象訪問,也可以通過類名訪問

2、static修飾成員函數

(1)靜態成員函數屬於類的靜態函數,並不是對象的成員。
(2)靜態成員函數沒有this指針,而非靜態成員函數有this指針
(3)靜態成員函數主要用來訪問靜態數據成員,不能訪問非靜態數據成員或非靜態成員函數

三、在linux模塊編程中static的作用

在linux模塊編程中,所有的全局變量和函數都要聲明爲static類型,將其作用域限制在本模塊內部,與其他模塊共享的函數或者變量要EXPORT到內核中。
主要有以下作用:
(1)設置變量的存儲域,函數體內static變量的作用範圍爲該函數體,不同於auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;

(2)限制變量的作用域,在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;

(3)限制函數的作用域,在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明它的模塊內;

四、總結

static功能強大,提高了數據的安全性之外,static修飾的函數或者變量還有很強的移植性。
在嵌入式系統中,要時刻懂得移植的重要性,程序可能是很多程序員共同協作同時完成,在定義變量及函數的過程,可能會重名,這給系統的集成帶來麻煩,因此保證不衝突的辦法是顯示的表示此變量或者函數是本地的,static即可。

發佈了115 篇原創文章 · 獲贊 74 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章