資源分類:有些記憶體是可讀的有些是可寫的,我們一般定義的char a,就是auto char a,就是自動變數,所謂普通變數就是在記憶體中可讀可寫中分配的一塊區域,如果這個變數定義在函式體中,我們認為這個自動變數實在棧空間中,記憶體分配的位置實際上跟某些**的執行流程有關係,比如手機開機的畫面,這種的話一般是放在只能讀不能寫的位置,不希望被別人修改,這時候就需要對記憶體存放位置和資源存放位置進行限定底層修飾符或者記憶體修飾符會大量的使用。
1、 auto:自動變數修飾符
2、 register:暫存器變數修飾符
3、 static:靜態變數修飾符
4、 extern:外部宣告
5、 const:常量修飾符
6、 volatile:記憶體位置修飾符
1、auto:自動變數修飾符
auto 預設情況(分配的記憶體都是可讀可寫的,區域如果在{},我們認為這是乙個棧空間) auto就是乙個佔位符來解釋我們的變數在那個位置,比如auto int a,這裡的auto就是解釋a在可讀可寫的記憶體當中,所以我們很少在**中使用,在**中也很少見到。
2、 register:暫存器變數修飾符
register:這個關鍵字表示這個變數是放在暫存器當中,而不是普通記憶體中。
register int a:限制變數,定義在暫存器上的修飾符,當我們發現變數使用的太頻繁的時候就考慮把他放到暫存器裡面,比我們放在記憶體中訪問的快的多,定義一些快速訪問的變數,register中看不中用,編譯器會盡量安排cpu的暫存器去存放變數,如果暫存器空間不夠了,a還是放在儲存器中,所以register不是乙個百分之百的事情。cpu的暫存器都是特殊值,所以定義register變數時,&對register不起作用。
# include
intmain
(void
)
記憶體(儲存器)
暫存器酷睿700
奔騰500
賽揚300
cpu快取器越多,執行速度越快
3、 static:靜態變數修飾符
應用場景
修飾3種資料,
1) 函式內部的變數
int fun()
2) 函式外部的變數(也就是全域性變數)
int a;=>static int a;
int fun()
3)函式的修飾符
int fun();=>static int fun();
這種在核心的開發中會大量的看到和用到,在多檔案工程中用的會比較多。
5、 extern:外部宣告
extern:外部宣告,主要在外部宣告全域性變數中使用,記憶體空間的框架建立後我們再來了解這個的使用。
const:常量的定義,c語言的軟肋也是中看不中用,初衷是定義成常量,不能進行修改的,只能讀的
const int a = 100:設計的初衷是唯讀的變數,但是c語言編譯器對這塊的限制並沒有那麼深,這個a也是可以修改的,記憶體中是可以分可讀的模組和可寫的記憶體模組,這個a是在rw中的,這個是可以修改的,但是不可以顯示的修改。比如定義後寫成a = 200,還是可以賦進去的,記憶體洩漏是一件很嚴重的事情。
6、 volatile:記憶體位置修飾符
volatile:並不是修飾記憶體位置的修飾符,實際上操作物件是我們的編譯器,告知編譯器編譯方法的關鍵字,不優化編譯。
修飾變數的值的修改,不僅僅可以通過軟體,也可以通過其他形式(硬體的外部使用者)
跟位址打交道比較多,也就是說跟硬體打交道的比較多,在傳統的應用開發,或者是上層開發,基本上是看不到這個關鍵字的,但是如果說涉及到嵌入式底層開發或者驅動開發甚至微控制器開發這個關鍵字會用的非常的多。
例子:比如這裡定義這個的a指的乙個鍵盤,當我們按下鍵盤a就等於100,否則a不等於100,這裡a如果是在軟體中是沒有什麼實際意義的,因為一直都是沒有變化的,while(a ==100);是一條死迴圈,但是如果是硬體進行修改了這裡的a就進行了變化,如果按照一般的理解,編譯器會覺著這個沒有什麼意義,直接可以優化掉,節省記憶體,但是因為硬體的狀態,其實a的值是變化的,所以是不能被優化的
int a =
100;
while
(a ==
100)
;mylcd()
;
f1:ldr r0, a//這裡是將a的位址讀到暫存器當中
f2:cmp r0, #100將暫存器中的值和100進行比對
f3:jmpeq: f1//重新讀取a到暫存器當中,直到a==100,會跳到f2,但是其實是沒有什麼意義的,看起來a一直都是100,編譯器如果開起來優化方法,就不會再一次從記憶體讀取a的值了,但是如果外部使用者按下了鍵盤,其實a的值是變化的了,會執行f4,所以每次a都需要從記憶體中去讀取數字到暫存器當中。
f4: mylcd();
型別修飾符volatile關鍵字
volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volatile nvint 當要求使...
修飾符,關鍵字
params修飾符 注 引數的最後乙個修飾符用於向方法傳遞數量不定的引數,關鍵字params必須與乙個單獨的一維陣列,並且應該是引數列表的最後一項,並且每個方法宣告中,只能有乙個params修飾符。如下所示 static void main name console.writeline ssn ss...
關鍵字 許可權修飾符
關鍵字,表示當前物件 當前 是哪個物件在執行,則this就只帶哪個物件 this的使用場景 this.屬性 或其當前物件的屬性值 this.屬性 值 設定當前物件的屬性值 this.方法名 呼叫當前物件的方法this語句 通過this來在構造方法中呼叫當前物件的其他構造方法格式 this 引數列表 ...