基礎(chǔ)C語言知識串串香12?存儲類&作用域&生命周期&鏈接屬性

七茉贡、存儲類&作用域&生命周期&鏈接屬性

7.1扁位、概念詞:存儲類(棧准潭、堆、數(shù)據(jù)區(qū)域仇、.bss段刑然、.text段)
作用域(代碼塊作用范圍,也就是變量作用的范圍)
生命周期(變量的誕生和死亡)
鏈接屬性(外鏈接屬性殉簸、內(nèi)鏈接屬性闰集、無連接屬性)

7.2、Linux下的內(nèi)存映射(分配情況般卑、組織情況):見圖內(nèi)存映射。其中有關(guān)進(jìn)程的空間爽雄,如進(jìn)程控制塊蝠检、頁表等都是在內(nèi)核里面的。文件區(qū)是映射外部文件的挚瘟,如打開記事本叹谁,那么這個文件臨時存放在文件區(qū)域。(見引用資料)

問題:虛擬地址技術(shù)乘盖? 解決:后期在Linux應(yīng)用/網(wǎng)絡(luò)編程會講焰檩。

OS下和裸機(jī)下C程序加載執(zhí)行的差異? 解決:在arm裸機(jī)第十六部分有介紹订框。

7.3析苫、存儲類關(guān)鍵字:

<1> auto 自動的(一個用法:修飾局部變量,在定義變量時可以省略) 【外鏈接:與第二個c文件鏈接】【內(nèi)鏈接:只與本c文件鏈接】【無連接:就是無鏈接】

<2> static 靜態(tài)的(有兩個用法穿扳,第一個是修飾局部變量衩侥,意思是當(dāng)作全局變量,存放在數(shù)據(jù)區(qū)矛物,作用域只是定義的那個函數(shù)范圍茫死,生命周期和整個程序一樣,屬于無連接

第二個是修改全局變量/函數(shù)履羞,意思是這個全局變量/函數(shù)只在當(dāng)前c文件有效峦萎,其他c文件是不能使用它的屡久,屬于內(nèi)鏈接,普通全局變量屬于外連接)
<3>register 寄存器(一個用法爱榔,修飾變量涂身,作用是讓編譯器把這個變量放在寄存器中,當(dāng)這個變量頻繁的被使用時搓蚪,用這個方法可以提高效率蛤售,但有時候不一定就放在寄存器,因為寄存器是有限的妒潭,沒有剩余的寄存器了)

<4>extern (一個用法悴能,修飾全局變量,表示該文件要使用的這個變量雳灾,在另外一個c文件中已經(jīng)定義了漠酿,其一個聲明的作用,不能初始化)

<5>volatile (一個用法谎亩,修飾變量炒嘲,表示對這個變量的語句不要去優(yōu)化)

(1) volatile的字面意思:可變的、易變的匈庭。C語言中volatile用來修飾一個變量夫凸,表示這個變量可以被編譯器之外的東西改變。編譯器之內(nèi)的意思是變量的值的改變是代碼的作用阱持,編譯器之外的改變就是這個改變不是代碼造成的夭拌,或者不是當(dāng)前代碼造成的,編譯器在編譯當(dāng)前代碼時無法預(yù)知衷咽。譬如在中斷處理程序isr中更改了這個變量的值鸽扁,譬如多線程中在別的線程更改了這個變量的值,譬如硬件自動更改了這個變量的值(一般這個變量是存在寄存器镶骗,或許當(dāng)其他進(jìn)程要用到這個寄存器時桶现,就把這個寄存器的變量給改變了,同時也就改變了這個變量)

(2) 以上說的三種情況(中斷isr中引用的變量鼎姊,多線程中共用的變量骡和,硬件會更改的變量)都是編譯器在編譯時無法預(yù)知的更改,此時應(yīng)用使用volatile告訴編譯器這個變量屬于這種(可變的此蜈、易變的)情況即横。編譯器在遇到volatile修飾的變量時就不會對改變量的訪問進(jìn)行優(yōu)化,就不會出現(xiàn)錯誤裆赵。

(3) 編譯器的優(yōu)化在一般情況下非常好东囚,可以幫助提升程序效率。但是在特殊情況(volatile)下战授,變量會被編譯器想象之外的力量所改變页藻,此時如果編譯器沒有意識到而去優(yōu)化則就會造成優(yōu)化錯誤桨嫁,優(yōu)化錯誤就會帶來執(zhí)行時錯誤。

而且這種錯誤很難被發(fā)現(xiàn)份帐。

(4) volatile是程序員意識到需要volatile然后在定義變量時加上volatile璃吧,如果你遇到了應(yīng)該加volatile的情況而沒有加程序可能會被錯誤的優(yōu)化。如果在不應(yīng)該加volatile而加了的情況程序不會出錯只是會降低效率废境。

所以我們對于volatile的態(tài)度應(yīng)該是:正確區(qū)分畜挨,該加的時候加不該加的時候不加,如果不能確定該不該加為了保險起見就加上噩凹。

舉例子1: int a=3 巴元,b,c;
b=a;
c=b;

那么編譯器會優(yōu)化成 c=b=a=3; 如果此時遇到上述三種情況驮宴,突然改變了a的值逮刨,那么,對于沒有優(yōu)化前是對的堵泽,但是對于優(yōu)化后修己,那么c仍然是3,就會出錯迎罗。

所以當(dāng)我們程序員知道這個變量會發(fā)生改變時睬愤,就應(yīng)該加 volatile,提示編譯器不要幫我們做優(yōu)化佳谦。

舉列子2:

int square(volatile int *ptr)
   {
   return *ptr * *ptr;
   }

這段代碼的有個惡作劇戴涝。這段代碼的目的是用來返指針ptr指向值的平方,但是钻蔑,由于ptr指向一個volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:

int square(volatile int *ptr)
  {
   int a,b;
   a = *ptr;
   b = *ptr;
   return a * b;
   }

由于*ptr的值可能被意想不到地該變奸鸯,因此a和b可能是不同的咪笑。結(jié)果,這段代碼可能返不是你所期望的平方值娄涩!正確的代碼如下:

long square(volatile int *ptr)
   {
    int a;
   a = *ptr;
   return a * a;
   }

<6> restrict (1)c99中才支持的窗怒,所以很多延續(xù)c89的編譯器是不支持restrict關(guān)鍵字,gcc支持的蓄拣。

(2)restrict 作用是讓編譯器對這個變量做一些優(yōu)化扬虚,讓它提高效率。下面的網(wǎng)站有列子球恤。

(3)restrict只用來修飾指針辜昵,不能修飾普通變量,它表示只能該指針才能修改它的內(nèi)容。如用memcpy時咽斧,兩個內(nèi)存存在重疊的現(xiàn)象堪置。

(4)https://blog.chinaunix.net/uid-22197900-id-359209.html (這個網(wǎng)站里面有詳細(xì)的例子)

(5)memcpy和memmove的區(qū)別 void *memcpy( void * restrict dest ,const void * restrict src,sizi_t n)躬存;這樣它可以優(yōu)化成memmove原理的方式(當(dāng)存在重疊時,先復(fù)制到一段內(nèi)存空間舀锨,然后再把它復(fù)制到目的空間)

7.4岭洲、作用域:

(1)全局變量起名字一般是 g_a;

(2)名字加前綴表示

7.5、總結(jié):<1>局部變量地址由運(yùn)行時在棧上分配得到坎匿,多次執(zhí)行時地址不一定相同盾剩,函數(shù)不能返回該類變量的地址(指針)作為返回值。

<2>為什么要分為數(shù)據(jù)段和.bbs段替蔬?因為當(dāng)加載到內(nèi)存重定位時告私,如果這些數(shù)據(jù)(包括0)一個一個的復(fù)制,會降低效率进栽,為0的變量德挣,直接清內(nèi)存就可以了,這樣提高效率快毛。

<3>在頭文件聲明全局變量時格嗅, extern int a; 聲明函數(shù)就是 void int max(int a, int b);

<4>寫程序盡量避免使用全局變量,尤其是非static類型的全局變量唠帝。能確定不會被其他文件引用的全局變量一定要static修飾屯掖。(因為全局變量占內(nèi)存的時間是最長的,要看你的變量是不是需要這么長的時間襟衰,這樣可以節(jié)約內(nèi)存空)


往期文章列表:****往期熱文:
基礎(chǔ)C語言知識串串香(1)

基礎(chǔ)C語言知識串串香(2)

基礎(chǔ)C語言知識串串香(3)

基礎(chǔ)C語言知識串串香(4)

基礎(chǔ)C語言知識串串香(5)

基礎(chǔ)C語言知識串串香(6)

基礎(chǔ)C語言知識串串香(7)

基礎(chǔ)C語言知識串串香(8)

基礎(chǔ)C語言知識串串香(9)

基礎(chǔ)C語言知識串串香(10)

基礎(chǔ)C語言知識串串香(11)


===========我是華麗的分割線===========


更多知識:
點(diǎn)擊關(guān)注專題:嵌入式Linux&ARM

或瀏覽器打開:http://www.reibang.com/c/42d33cadb1c1

或掃描二維碼:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贴铜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瀑晒,更是在濱河造成了極大的恐慌绍坝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苔悦,死亡現(xiàn)場離奇詭異轩褐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)玖详,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門把介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蟋座,你說我怎么就攤上這事拗踢。” “怎么了向臀?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵巢墅,是天一觀的道長。 經(jīng)常有香客問我,道長砂缩,這世上最難降的妖魔是什么作谚? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮庵芭,結(jié)果婚禮上妹懒,老公的妹妹穿的比我還像新娘。我一直安慰自己双吆,他們只是感情好眨唬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著好乐,像睡著了一般匾竿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔚万,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天岭妖,我揣著相機(jī)與錄音,去河邊找鬼反璃。 笑死昵慌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淮蜈。 我是一名探鬼主播斋攀,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梧田!你這毒婦竟也來了淳蔼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裁眯,失蹤者是張志新(化名)和其女友劉穎鹉梨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穿稳,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俯画,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了司草。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡泡仗,死狀恐怖埋虹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娩怎,我是刑警寧澤搔课,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站截亦,受9級特大地震影響爬泥,放射性物質(zhì)發(fā)生泄漏柬讨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一袍啡、第九天 我趴在偏房一處隱蔽的房頂上張望踩官。 院中可真熱鬧,春花似錦境输、人聲如沸蔗牡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辩越。三九已至,卻和暖如春信粮,著一層夾襖步出監(jiān)牢的瞬間黔攒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工强缘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留督惰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓欺旧,卻偏偏與公主長得像姑丑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辞友,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這幾天有朋友反映給小編說讓多發(fā)點(diǎn)關(guān)于面試的文章称龙,小編深知從事IT行業(yè)的難處留拾,跳槽多,加班多鲫尊,薪資不樂觀痴柔,大多數(shù)朋友...
    諸葛青云999閱讀 10,075評論 0 6
  • 題目來源:1、中興疫向、華為咳蔚、慧通、英華達(dá)搔驼、微軟亞洲技術(shù)中心等中外企業(yè)面試題目谈火;2、C 語言面試寶典(林銳《高質(zhì)量編程...
    月震閱讀 1,814評論 0 1
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,103評論 1 32
  • 畢業(yè)工作兩年温技,一名農(nóng)村音樂教師革为。 一份家人及親戚們口中的穩(wěn)定的好工作,于我舵鳞,卻好似溫水煮青蛙震檩,冷暖自知。 對于家人...
    珊瑚的眼淚閱讀 204評論 0 0
  • 有時候系任,我想聽歌曲恳蹲。 有時候,我想聽大海的喧囂俩滥。 有時候嘉蕾,我想聽那鳥兒食米鳥叫的聲音。 有時候霜旧,我想聽這所有的樂器...
    妤優(yōu)閱讀 494評論 0 0