欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言關(guān)鍵字auto與register的深入理解

 更新時(shí)間:2013年05月31日 18:16:17   作者:  
本篇文章是對(duì)c語言關(guān)鍵字auto與register的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

關(guān)鍵字概述
很多朋友看到這兒可能會(huì)有疑問,往往其它講C語言的書籍都是從HelloWorld,數(shù)據(jù)類型開始C語言學(xué)習(xí)的,為什么我們要從C語言的關(guān)鍵字開始呢?關(guān)于這點(diǎn),我有兩點(diǎn)需要說明:
本章節(jié)面向的讀者對(duì)象是有一定的C語言基礎(chǔ)知識(shí)的朋友(至少應(yīng)該學(xué)習(xí)過大學(xué)里的C語言程序設(shè)計(jì)等類似的課程)
本章節(jié)結(jié)合了作者多年嵌入式工作、研究、教學(xué)經(jīng)驗(yàn)而作,由計(jì)算機(jī)底層硬件到上層軟件設(shè)計(jì)融會(huì)貫通,中間有大量的深入淺出的示例

在我對(duì)C語言進(jìn)行培訓(xùn)的時(shí)候,往往就是從C語言的關(guān)鍵字入手,因?yàn)镃語言的關(guān)鍵字蘊(yùn)含了C語言的全部的詞匯,囊括了C語言里大量知識(shí)要點(diǎn),從C語言關(guān)鍵字開刀,首先可以對(duì)你之前所學(xué)知識(shí)進(jìn)行復(fù)習(xí),其次,切磋一下和作者有什么不同的見解,廢話少說,讓我們從關(guān)鍵字開始。
關(guān)鍵字,又叫保留字,是編譯器能識(shí)別的特殊單詞,每種計(jì)算機(jī)語言都會(huì)有其特定的關(guān)鍵字,C語言中有32位關(guān)鍵字。
問:為什么要有關(guān)鍵字?
答:關(guān)鍵字是程序設(shè)計(jì)中代碼必須包含的部分,編譯器在編譯C代碼的時(shí)候,必然要將C代碼進(jìn)行斷句,將代碼分割成不同部分,將這些部分分別進(jìn)行解析和編譯。
int a = 10;  int是關(guān)鍵字,編譯器看到它出現(xiàn),會(huì)將它后面的字符作為整型變量名來處理。
也就是說,關(guān)鍵字是編譯器能認(rèn)識(shí)的特殊字符串符號(hào)。
關(guān)鍵字的數(shù)量是由編譯器來決定的,關(guān)鍵字大小寫敏感性也和編譯器有關(guān)。如果關(guān)鍵字寫錯(cuò),那么在代碼的解析過程中,編譯器就會(huì)報(bào)錯(cuò):符號(hào)不能識(shí)別或符號(hào)不能被解析。
每個(gè)關(guān)鍵字有著不同的意義,用來告知編譯器編程者的目的。

關(guān)鍵字分類
32個(gè)關(guān)鍵字每個(gè)都有不同的意義,大體上根據(jù)其意義可以分為以下幾類(下劃線表示不同分類中有交集):
1)非常見:auto、register、volatile、goto
2)存儲(chǔ)相關(guān):const、extern、register、volatile、static、auto、signed、unsigned
3)數(shù)據(jù)類型:char、short、int、float、long、double、struct、union、enum、void
4)邏輯控制:if、else、for、while、do、break、continue、return、default、switch、case、goto
5)特殊用途:sizeof、typedef
我相信,大部分關(guān)鍵字我們都能認(rèn)識(shí),并且能夠使用,有一部分可能很少見,甚至一點(diǎn)印象也沒有:它也是C語言的關(guān)鍵字???
1.隱形刺客:auto
描述:
auto關(guān)鍵字在我們寫的代碼里幾乎看不到,但是它又無處不在,它是如此的重要,又是如此的與世無爭,默默的履行著自己的義務(wù),卻又隱姓埋名。
作用:C程序是面向過程的,在C代碼中會(huì)出現(xiàn)大量的函數(shù)模塊,每個(gè)函數(shù)都有其生命周期(也稱作用域),在函數(shù)生命周期中聲明的變量通常叫做局部變量,也叫自動(dòng)變量。例如:

復(fù)制代碼 代碼如下:

    int fun(){ 
          int a = 10;      // auto int a = 10; 
          // do something 
          return 0; 
    } 

復(fù)制代碼 代碼如下:

    int fun(){ 
          int a = 10;      // auto int a = 10; 
          // do something 
          return 0; 
    } 

整型變量a在fun函數(shù)內(nèi)聲明,其作用域?yàn)閒un函數(shù)內(nèi),出來fun函數(shù),不能被引用,a變量為自動(dòng)變量。也就是說編譯器會(huì)有int a = 10之前會(huì)加上auto的關(guān)鍵字。
auto的出現(xiàn)意味著,當(dāng)前變量的作用域?yàn)楫?dāng)前函數(shù)或代碼段的局部變量,意味著當(dāng)前變量會(huì)在內(nèi)存棧上進(jìn)行分配。
內(nèi)存棧:
如果大家學(xué)過數(shù)據(jù)結(jié)構(gòu),應(yīng)該知道,棧就是先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。它類似于我們用箱子打包書本,第一本扔進(jìn)去大英,第二本扔進(jìn)行高數(shù),第三本扔進(jìn)行小說,那么取書的時(shí)候,先取出來第一本是小說,第二是高數(shù),第三本是大英。
棧的操作為入棧和出棧,入棧就是向箱子里扔書,出棧就是從箱子里取書。那么這和我們的auto變量分配空間有什么關(guān)系呢?
由于一個(gè)程序中可能會(huì)有大量的變量聲明,每個(gè)變量都會(huì)占有一定的內(nèi)存空間,而內(nèi)存空間對(duì)于計(jì)算機(jī)來說是寶貴的硬件資源,因此合理的利用內(nèi)存是編譯器要做的一個(gè)主要任務(wù)。有的變量是一次性使用的,如局部變量。有的變量要伴隨著整個(gè)程序來使用的,如全局變量。為了節(jié)省內(nèi)存空間,優(yōu)化性能,編譯器通常會(huì)將一次性使用的變量分配在棧上。也就是說,代碼中聲明一個(gè)一次性變量,就在棧上進(jìn)行入棧操作。當(dāng)該變量使用完了(生命周期結(jié)束),進(jìn)行出棧操作。這樣,在執(zhí)行不同的函數(shù)的時(shí)候,就會(huì)在一個(gè)棧上進(jìn)行出入棧操作,也就是說它們?cè)陬l繁的使用一個(gè)相同的內(nèi)存空間,從而可以更高效的利用內(nèi)存。

PS:有的編譯器為了提高效率,在出棧時(shí)不會(huì)進(jìn)行數(shù)據(jù)清空,這也就意味著,下個(gè)函數(shù)里的變量在入棧使用該空間時(shí),里面的數(shù)據(jù)是上一次變量操作的結(jié)果。
2.閃電飛刀:register
描述:register就和它的名字一樣,很少出現(xiàn)在代碼世界中,因?yàn)楦曳Q為閃電飛刀的變量,通常只會(huì)在一些特定場合才能出現(xiàn)。它是如此的快,以致于CPU都對(duì)其刮目相看,但是它有一個(gè)致命的缺點(diǎn),它的速度“看心情”而定,不是每一次都能讓人滿意。
作用:如果一個(gè)變量被register來修辭,就意味著,該變量會(huì)作為一個(gè)寄存器變量,讓該變量的訪問速度達(dá)到最快。比如:一個(gè)程序邏輯中有一個(gè)很大的循環(huán),循環(huán)中有幾個(gè)變量要頻繁進(jìn)行操作,這些變量可以聲明為register類型。
寄存器變量:寄存器變量是指一個(gè)變量直接引用寄存器,也就是對(duì)變量名的操作的結(jié)果是直接對(duì)寄存器進(jìn)行訪問。寄存器是CPU的親信,CPU操作的每個(gè)操作數(shù)和操作結(jié)果,都由寄存器來暫時(shí)保存,最后才寫入到內(nèi)存或從內(nèi)存中讀出。也就是說,變量的值通常保存在內(nèi)存中,CPU對(duì)變量進(jìn)行讀取先是將變量的值從內(nèi)存中讀取到寄存器中,然后進(jìn)行運(yùn)算,運(yùn)算完將結(jié)果寫回到內(nèi)存中。為什么要這么設(shè)計(jì),而不直接對(duì)變量的值從內(nèi)存中進(jìn)行運(yùn)算,而要再借助于寄存器?這是由于考慮到性能的問題才這么設(shè)計(jì)的。在計(jì)算機(jī)系統(tǒng)中,包含有很多種不同類型的存儲(chǔ)器,如表xxx所示。
表xxx 計(jì)算機(jī)存儲(chǔ)器分類

名稱

速度

特點(diǎn)

用途

靜態(tài)存儲(chǔ)器

最快

造價(jià)高,體積大,適合小容量的緩存

寄存器,緩存

動(dòng)態(tài)存儲(chǔ)器

較快

造價(jià)較低,體積較小,適合大容易保存數(shù)據(jù)

內(nèi)存


在計(jì)算機(jī)中CPU的運(yùn)算速度最快,現(xiàn)在都達(dá)到3GHZ左右,而相對(duì)應(yīng)的存儲(chǔ)器速度卻相對(duì)慢很多,訪問速度最快的寄存器和緩存,由于其體積又大,不適合大容量的使用,所以只能二者相接合的方式來提高效率。程序代碼保存在內(nèi)存中,當(dāng)使用數(shù)據(jù)時(shí),將其送到寄存器,讓CPU來訪問,使用完畢,送回內(nèi)存保存。而C語言又允許使用寄存器來保存變量的值,很明顯這樣能大大提高程序的執(zhí)行速度,但是,寄存器的個(gè)數(shù)是有限的,X86也就是十幾個(gè),ARM最多才37個(gè)。我們不可能將全部的變量都聲明為寄存器變量,因?yàn)槠渌a也要使用寄存器,同樣,我們聲明的寄存器變量也不一定直接保存在寄存器中,因?yàn)榧拇嫫骺赡苋慷荚诒黄渌a占用。編譯器只能是盡量的為我們的變量安排在寄存器中。
在使用寄存器變量時(shí),請(qǐng)注意:
待聲明為寄存器變量類型應(yīng)該是CPU寄存器所能接受的類型,意味著寄存器變量是單個(gè)變量,變量長度應(yīng)該小于等于寄存器長度
不能對(duì)寄存器變量使用取地址符“&”,因?yàn)樵撟兞繘]有內(nèi)存地址
盡量在大量頻繁的操作時(shí)使用寄存器變量,且聲明的變量個(gè)數(shù)應(yīng)該盡量的少

相關(guān)文章

  • 一篇文章帶你了解C語言函數(shù)的可重入性

    一篇文章帶你了解C語言函數(shù)的可重入性

    這篇文章主要為大家詳細(xì)介紹了C語言函數(shù)的可重入性,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++中的memset用法詳解

    C++中的memset用法詳解

    memset是一個(gè)初始化函數(shù),作用是將某一塊內(nèi)存中的全部設(shè)置為指定的值,本文給大家介紹C++中的memset用法,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • c語言求1+2+...+n的解決方法

    c語言求1+2+...+n的解決方法

    本篇文章是對(duì)在c語言中求1+2+...+n的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言使用鏈表實(shí)現(xiàn)學(xué)生籍貫管理系統(tǒng)

    C語言使用鏈表實(shí)現(xiàn)學(xué)生籍貫管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言使用鏈表實(shí)現(xiàn)學(xué)生籍貫管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • OpenCV3實(shí)現(xiàn)車牌識(shí)別(C++版)

    OpenCV3實(shí)現(xiàn)車牌識(shí)別(C++版)

    這篇文章主要為大家詳細(xì)介紹了OpenCV3實(shí)現(xiàn)車牌識(shí)別功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++中繼承與多態(tài)的基礎(chǔ)虛函數(shù)類詳解

    C++中繼承與多態(tài)的基礎(chǔ)虛函數(shù)類詳解

    這篇文章主要給大家介紹了關(guān)于C++中繼承與多態(tài)的基礎(chǔ)虛函數(shù)類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 深入了解C語言中的動(dòng)態(tài)內(nèi)存分配

    深入了解C語言中的動(dòng)態(tài)內(nèi)存分配

    這篇文章主要為大家詳細(xì)介紹了C語言中的動(dòng)態(tài)內(nèi)存分配,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語言有一定的幫助,需要的可以參考一下
    2022-06-06
  • C/C++ 多線程的學(xué)習(xí)心得總結(jié)

    C/C++ 多線程的學(xué)習(xí)心得總結(jié)

    本篇文章是對(duì)C/C++中多線程的學(xué)習(xí)心得總結(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考

    C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考

    今天小編就為大家分享一篇關(guān)于C++實(shí)踐數(shù)組類運(yùn)算的實(shí)現(xiàn)參考,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C語言鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    C語言鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論