2 再論與Static相關的問題

2022-02-12 20:28:38 字數 1496 閱讀 6126

一、

1、c++中

static

的含義及名字控制

c/c++中,static有兩層含義:在固定的位址上進行儲存分配,也就是說物件是在乙個特殊的靜態資料區上建立的,而不是每次函式呼叫時在堆疊上產生的。第二層含義是:對乙個特定的編譯單位來說是區域性的。

2、static變數是在鏈結階段完成賦值的。

3、靜態初始化的相依性問題

4、變數的生存期和作用域

二、可重入函式與不可重入函式

1、概念:主要用於多工環境中,乙個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。

也可以這樣理解,重入即表示重複進入,首先它意味著這個函式可以被中斷,其次意味著它除了使用自己棧上的變數以外不依賴於任何環境(包括static),這樣的函式就是 purecode(純**)可重入,可以允許有該函式的多個副本在執行,由於它們使用的是分離的棧,所以不會互相干擾。如果確實需要訪問全域性變數(包括 static),一定要注意實施互斥手段。可重入函式在並行執行環境中非常重要,但是一般要為訪問全域性變數付出一些效能代價。

編寫可重入函式時,若使用全域性變數,則應通過關中斷、訊號量(即p、v操作)等手段對其加以保護。

說明:若對所使用的全域性變數不加以保護,則此函式就不具有可重入性,即當多個程序呼叫此函式時,很有可能使有關全域性變數變為不可知狀態。

2、保證函式的可重入性的方法:

在寫函式時候盡量使用區域性變數(例如暫存器、堆疊中的變數),對於要使用的全域性變數要加以保護(如採取關中斷、訊號量等方法),這樣構成的函式就一定是乙個可重入的函式。

vxworks中採取的可重入的技術有:

* 動態堆疊變數(各子函式有自己獨立的堆疊空間)

* 受保護的全域性變數和靜態變數

* 任務變數

3、不可重入函式在實時系統設計中被視為不安全函式。滿足下列條件的函式多數是不可重入的:

1) 函式體內使用了靜態的資料結構;

2) 函式體內呼叫了malloc()或者free()函式;

3) 函式體內呼叫了標準i/o函式。

4、如何將乙個不可重入的函式改寫成可重入的函式?

把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。

1) 不要使用全域性變數。因為別的**很可能覆蓋這些變數值。

2) 在和硬體發生互動的時候,切記執行類似disinterrupt()之類的操作,就是關閉硬體中斷。完成互動記得開啟中斷,在有些系列上,這叫做「進入/ 退出核心」。

3) 不能呼叫其它任何不可重入的函式。

4) 謹慎使用堆疊。最好先在使用前先os_enter_kernal。

把全域性變數加上static改變的是其作用域。

把區域性變數加上static改變的是其生存期。

參考[1] 

再論介面和抽象的聯絡與區別

很多時候,我面試別人的時候我經常會問到,介面與抽象的區別,我覺得這個能很好的考察應聘人員的物件導向的綜合能力,在網上收集了一些的結論,大家看看。另外,實現介面的一定要實現介面裡定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是介面,然後是抽象類實現介面,最後才到具體...

ubuntu的相關問題 2

7 一般可能是不裝上make的,所以要裝build essential開發工具包 或者 sudo apt get installmake 8 ubuntu不使用rpm,而是deb sudo apt get install alien 可以用alien將rpm檔案轉為deb檔案 9 編譯xsuppli...

論貪心策略的選擇 對區間排程問題的再思考

對區間排程問題的再思考 演算法設計c4.1中引入了無權區間排程問題,這一問題的貪心策略為按照任務結束時間排序。這一策略是如何得到的呢?教科書給出的方法是先想出若干可以進行排序的維度,然後通過舉反例的方式去進行驗證,最後刪去錯誤的,留下正確的貪心策略。然而,這樣的思考方式在面對實際問題的時候實際上很容...