一、static
關鍵字static,修飾變量時:
1、限制該變量的作用域:比如靜態全局變量,只能在該模塊中使用(本c文件中)。
2、決定該變量的存儲位置:修飾為靜態的變量,存儲在靜態數據區(非堆棧內)。(同比,全局變量也都存放在靜態數據區中。)
帶初值和不帶初值的靜態變量:(以TI DSP 54XX為例)
a.不帶初值的靜態變量,存儲在.bss段中。
b.帶初值的靜態變量,存儲在.bss段中,但其初值存儲在.init中。在DSP Booter完成加載初始化後已經將init段的值賦值到.bss對應變量中。
關鍵字static,修飾函數時:限制該函數的作用域,僅能在本模塊中使用(本c文件中)。
結論:static關鍵字對於使用者而言,最重要的是對變量或函數作用域的限制。
二、const
關鍵字const意味著“不變的”:
1、什麼時候該用:定義一個函數時如果在輸入參數前加上const,可以防止該輸入變量被改寫而引出的錯誤;函數定義時使用const可以起到函數API自注釋作用;
2、怎麼用:
以下摘錄經典面試題中的例子:
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數。
第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。
第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。
最後一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。
三、volatile
關鍵字volatile意味著“易改變的”:
修飾為volatile的變量,編譯器不會對其進行任何優化,每次求值時會到指定地址(物理或映射)去讀取。因此適用於“並行設備的硬件寄存器(如:狀態寄存器) ;一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables) ;多線程應用中被幾個任務共享的變量 ”,我個人只用到在IO和中斷中。
四、堆與棧(heap and stack)
1) 堆是由用戶維護的。比如我們malloc一段空間,此時開辟的空間便在堆中,調用free時再釋放。過於頻繁的malloc與free會導致堆中產生碎片(一個空間的地址不連續),影響讀寫速度。
2) 棧是由編譯器控制的,我們無需干涉。比如我們定義的局部變量或是調用了一個函數。以函數調用為例,此時系統會將現場數據(主要是部分寄存器中的數據,如PC的保存可以在調用結束時程序回歸此處繼續運行)壓入棧內,將寄存器空出迎接被調函數中的一系列計算和控制。被調函數執行完後再進行出棧操作,流程繼續。