1005------C語言-----------C語言變量的存儲方式解析

0.背景緩存

  在看APUE第七章的時候,做者分析了setjmp和longjmp這種函數間跳起色制對不一樣存儲類型變量的影響,看到register,auto,volatile,static等等這些關鍵字很模糊,也可能太少用了,可是自認爲C語言基礎不錯的我仍是不能接受任何不懂的知識點,因而就捋了捋思路。函數

1.C語言變量的基本屬性優化

  在C語言中,每個變量都有3個屬性spa

  (1)類型,就是經常使用的int、char等,它肯定了變量存儲長度和運算方式;.net

  (2)做用域,根據變量所處的位置分爲全局變量和局部變量;blog

  (3)存儲方式,即變量的生存期,分爲靜態存儲方式和動態存儲方式。內存

2.靜態存儲方式和動態存儲方式作用域

  (1)靜態存儲方式是指變量在程序執行的全過程中始終佔據着大小固定的存儲單元,直到程序運行結束才予以釋放。編譯器

  (2)動態存儲的變量是指變量的存儲單元在程序運行過程當中由系統動態地分配和回收,當定義它們的函數被調用時分配內存,當定義它們的函數返回時系統收回變量所佔內存。編譯

3.和存儲方式有關的關鍵字

  (1)auto:自動變量,缺省狀況下,全部變量都是auto的,這是C語言中使用最普遍的一種。自動變量爲局部變量,存儲方式屬於動態存儲,系統不爲其進行默認初始化,未初始化的靜態變量指向一個不可預期的、無心義的值。只有在使用它,即定義該變量的函數被調用時纔給它分配存儲單元,開始它的生存期。函數調用結束,釋放存儲單元,結束生存期。

  (2)register:寄存器變量,與auto同樣,屬局部變量,動態存儲方式。寄存器變量請求編譯器儘量將變量存儲在CPU內部寄存器中而不是經過內存訪問以提升效率。注意,對於寄存器變量,不少C編譯器並無真正將寄存器變量放到CPU內部,而是做爲自動變量處理。使用register只是提示編譯器將變量定義爲寄存器變量,指望編譯器將其做爲寄存器變量,但不必定能達到指望。由於要看編譯器是否支持了,其次看看CPU內部是否有可用寄存器空間。

  (3)static:靜態變量,分爲靜態全局變量和靜態局部變量。咱們都知道局部變量是動態存儲的,用static修飾局部變量就稱做靜態局部變量,它使得該局部變量擁有靜態存儲的生存期,即從分配內存單元起一直到程序運行結束。靜態全局變量使得該全局變量只能在定義它的文件中使用,對於通常的全局變量要想在別的文件中訪問只須要一個外部引用聲明便可(extern)。此外,基本類型的靜態變量系統會自動爲其賦初值,靜態存儲方式不等於靜態變量。

  (4)extern:外部變量,修飾變量或函數,表示這個變量或者函數是外來的,即定義在別的文件中,這個比較常見。

  (5)volatile易失變量,這個不多用見到,易失變量用來防止編譯器優化,告訴編譯器每次必須去內存中取值,而不是從寄存器或者緩存,這裏要知道編譯器優化手段之一就是把內存變量保存到寄存器中以提升效率,變量前面加volatile就是禁止這個操做。

4.參考資料

  (1)http://lavasoft.blog.51cto.com/62575/186951/

  (2)http://blog.csdn.net/ouyangzhengxuan/article/details/7325505

  (3)http://www.worlduc.com/blog2012.aspx?bid=3243095

  (4)《C語言深度剖析》

相關文章
相關標籤/搜索