91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言之存儲類的相關的關鍵字

發布時間:2020-06-30 16:38:18 來源:網絡 閱讀:445 作者:菜鳥養成記 欄目:編程語言

  不同的數據在內存中的存儲位置是不同的,總體來說內存中存儲數據的地方主要有四部分:棧、堆、數據段、bss段,這些地方分別存放著不同的數據,比如棧一般用來存儲局部變量,堆內存需要程序員字自己申請以及釋放,主要用來存放比較大的數據;數據段主要用來存放顯示初始化的全局變量和static關鍵字修飾的靜態局部變量;bss段一般用來存放未顯式初始化的全局變量或顯式初始化為0的全局變量(C語言中,默認全局變量初始化為0)。C語言還提供了一些關鍵字來修飾變量,使其附有其他的屬性,這些關鍵字主要有:auto、static、const、register、extern、volatile、restrict。


1:auto

  auto關鍵字的作用只有一個:修飾局部變量,auto關鍵字修飾后的局部變量表示是自動局部變量,自動局部變量是分配在棧上面的,C語言中默認局部變量就是自動局部變量。


2:static

  static關鍵字的作用有兩種:

  第一種:修飾局部變量,得到靜態局部變量,靜態局部變量是被分配在數據段或者bss段上面的,而非靜態局部變量是被分配在棧上面的。

  第二種:修飾全局變量,得到靜態全局變量,靜態全局變量和非靜態全局變量的比較如下:

(1)靜態全局變量和全局變量的存儲類一樣,都是被分配在數據段或者bss段

(2)靜態全局變量和全局變量的生命周期一樣,

(3)靜態局部變量的作用域是代碼塊作用域({}:為一個代碼塊,普通局部變量一

樣),鏈接屬性是無連接;全局變量的作用域是文件作用域(和函數一樣),鏈接屬性是外連接。


3:const

  const常被稱為常量修飾符,也就是說const修飾后的“變量”變成了常量,(所以在函數傳參時常用const來修飾輸入型參數,不用const修飾的參數我們常認為是輸出型參數。)但是在C語言中,這種常量也不算是完全不可變的,因為const修飾后的“變量”并不是被放到代碼段(代碼段是只讀的,數據被放到代碼段就無法修改),const關鍵字修飾的“變量”通過指針的方式還是可以修改的,具體實現是通過指針指向這個“變量”,然后解引用就可以修改const修飾后的“變量”。


4:register

 register關鍵字不常用,它的作用也是唯一的:register修飾的變量,將來在編譯的時候編譯器會盡量將它分配到寄存器中(平時一般的變量都是被分配到內存中的),變量被分配到寄存器中其使用和被分配到內存中是一樣的,但是其速寫的效率會高很多。但是由于寄存器的數量是有限的,所以這里只是盡量放到寄存器中,而不是一定。我們平時需要用register修飾的變量很少,所以需要慎用。


5:extern

  extern關鍵字是用來聲明全局變量的,原因是C語言中編譯的時候是以單個.c文件為單位來進行編譯的,但是一個大的工程中不可能只有一個.c文件,這個時候就需要extern將變量,函數等聲明要.c文件外部,這樣編譯的時候a.c中的函數和變量就可以被b.c所調用。


6:volatile

 volatile修飾的變量表示這個變量隨時可以被修改,因此編譯后的程序每次需要存儲或者讀取這個變量時都會直接從變量地址中去讀取數據,而沒有volatile修飾的變量,則編譯器可能會優化讀取和存儲,可能暫時使用的就是寄存器中的值,如果這個變量被其他程序修改了的話,編譯器就有可能認為這個變量仍然沒有被修改(原因是讀取的可能是寄存器里面的那個副的變量值,而程序修改的是內存中變量的值)

int flag; 
void test(void)
{    
    do1();
    while(flag==0);
    do2();
    
}

只有當flag不為0時,d02()函數才能被被執行,假設現在我們通過按下按鍵來產生中斷,然后再中斷處理函數中將flag賦值為1,這樣d02()函數就能被執行了,但是編譯器并不知道flag的值被其他程序所修改了,原因是編譯器在編譯的時候會對程序進行優化,這樣的優化會可能會將flag放入寄存器,下次讀取的時候就可能的是寄存器中的flag的那個值。

一般來說,volatile主要用在下面幾個地方

(1)中斷服務程序中修改的供其他程序檢測的變量

(2)多任務環境下各任務間共享的標志應該加volatile

(3)存儲器映射的硬件寄存器通常也要加volatile進行說明,因為每次對他們的讀寫可能不同。

簡單來說,volatile總是和優化有關,編譯器有一種技術叫做數據流分析,分析程序中的變量在哪賦值、在哪使用、在哪失效,分析結果可以用于常量合并,常量傳播優化,進一步可以死代碼消除,但是有時候程序不需要這些優化,這時候就可以通過volatile來禁止這些優化。

對于volatile關鍵字的描述主要來自于下面的博客

http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html


7:restrict

restrict關鍵字只能用來修飾指針,不能用來修飾變量,具體用法可參照下文

http://blog.chinaunix.net/uid-22197900-id-359209.html





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淮南市| 扶余县| 南召县| 山西省| 溧水县| 武山县| 阳朔县| 中方县| 卢龙县| 延川县| 长寿区| 昌平区| 西畴县| 冕宁县| 湾仔区| 赣榆县| 仙桃市| 丁青县| 太白县| 昭平县| 枣强县| 衡水市| 措勤县| 南木林县| 阿克苏市| 台东市| 电白县| 福建省| 东乡族自治县| 乐山市| 乐平市| 清涧县| 威海市| 朝阳区| 汨罗市| 连山| 安徽省| 灌阳县| 孙吴县| 九寨沟县| 泾川县|