新聞中心

        EEPW首頁 > 設(shè)計應(yīng)用 > 分享7道最近常問的嵌入式面試題

        分享7道最近常問的嵌入式面試題

        作者: 時間:2024-04-09 來源: 收藏

        1. 關(guān)鍵字static的作用是什么?為什么static變量只初始化一次?

        本文引用地址:http://www.104case.com/article/202404/457326.htm


        · 修飾局部變量:使得變量變成靜態(tài)變量,存儲在靜態(tài)區(qū),存儲在靜態(tài)區(qū)的數(shù)據(jù)周期和程序相同,在main函數(shù)開始前初始化,在退出程序時銷毀(無論是局部靜態(tài)還是全局靜態(tài))。

        · 修飾全局變量:全局變量本身就是存儲在靜態(tài)區(qū),因此static并不能改變其存儲位置。但是,static限制了其鏈接屬性,被static修飾的全局變量只能被該包含該定義的文件訪問(即改變了作用域)

        · 修飾函數(shù):是的該函數(shù)只能在包含該函數(shù)定義的的文件中被調(diào)用,對于靜態(tài)函數(shù),申明和定義需要放到同一個文件夾中。

        · 修飾成員變量:使用static修飾類的數(shù)據(jù)成員使其成為類的全局變量,會被類的所有對象共享,包括派生類的對象,所有的對象都只維持同一個實例。因此,static成員必須在類外進行初始化(初始化格式:int base::var=10;),而不能在構(gòu)造函數(shù)內(nèi)進行初始化,不過也可以使用const修飾的static數(shù)據(jù)成員在類內(nèi)初始化。

        · 修飾成員函數(shù):使用static修飾成員函數(shù),使這個類只存在這一份函數(shù),所有對象共享該函數(shù),不含this指針,因而只能訪問類的static成員變量。

        靜態(tài)成員是可以獨立訪問的,也就是說,無需創(chuàng)建任何對象實例就可以訪問。例如可以分裝某些算法,比如數(shù)學(xué)函數(shù),如sin、cos等,這些函數(shù)本就沒必要屬于某一個對象,所以從類上調(diào)用更好。

        注意:不可以用const static修飾成員函數(shù)。

        對于所有的對象(不僅僅是靜態(tài)對象),初始化都只有一次,而由于靜態(tài)變量具有“記憶”功能,初始化后,一直都沒有被銷毀,都會保存在內(nèi)存區(qū)域中,所以不會再次初始化。

        存放在靜態(tài)區(qū)的變量的生命周期一般比較長,一般與整個源程序“同生死、共存亡”,所以它只需初始化一次。


        2. 關(guān)鍵字voliate作用和含義/使用場景?


        volatile是一個類型修飾符(type specifier)。它是被設(shè)計用來修飾被不同線程訪問和修改的變量。如果沒有volatile,基本上會導(dǎo)致這樣的結(jié)果:要么無法編寫多線程程序,要么編譯器失去大量優(yōu)化的機會。

        如果沒有volatile關(guān)鍵字,則編譯器可能優(yōu)化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由別的程序更新了的話,將出現(xiàn)不一致的現(xiàn)象。

        一般用處:

        · 并行設(shè)備的硬件寄存器(如狀態(tài)寄存器):存儲器映射的硬件寄存器通常也要加 voliate,因為每次對它的讀寫都可能有不同意義。

        · 中斷服務(wù)程序中修改的供其它程序檢測的變量,需要加volatile:當(dāng)變量在觸發(fā)某中斷程序中修改,而編譯器判斷主函數(shù)里面沒有修改該變量,因此可能只執(zhí)行一次從內(nèi)存到某寄存器的讀操作,而后每次只會從該寄存器中讀取變量副本,使得中斷程序的操作被短路。

        · 多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志,應(yīng)該加volatile:在本次線程內(nèi), 當(dāng)讀取一個變量時,編譯器優(yōu)化時有時會先把變量讀取到一個寄存器中;以后,再取變量值時,就直接從寄存器中取值;當(dāng)內(nèi)存變量或寄存器變量在因別的線程等而改變了值,該寄存器的值不會相應(yīng)改變,從而造成應(yīng)用程序讀取的值和實際的變量值不一致 。

        · 一個參數(shù)既可以是const還可以是volatile嗎?可以的,例如只讀的狀態(tài)寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應(yīng)該試圖去修改它。

        · volatile的本意是“易變的”由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,但有可能會讀臟數(shù)據(jù)。當(dāng)要求使用volatile聲明的變量的值的時候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。


        3. sizeof和strlen的區(qū)別,使用場景?


        sizeof() 和 strlen() 的主要區(qū)別在于:

        · sizeof() 是一個運算符,而 strlen() 是一個函數(shù)

        · sizeof() 計算的是變量或類型所占用的內(nèi)存字節(jié)數(shù),而 strlen() 計算的是字符串中字符的個數(shù)。

        · sizeof() 可以用于任何類型的數(shù)據(jù),而 strlen() 只能用于以空字符 '

        主站蜘蛛池模板: 庄河市| 岐山县| 虹口区| 神农架林区| 唐河县| 四平市| 萨迦县| 根河市| 福州市| 万州区| 棋牌| 富锦市| 遂川县| 犍为县| 马尔康县| 治多县| 绥阳县| 江口县| 兖州市| 来凤县| 平阴县| 大名县| 湟源县| 威海市| 舒城县| 鄯善县| 双牌县| 阿拉善右旗| 台北市| 井冈山市| 中阳县| 增城市| 石景山区| 汝阳县| 花莲县| 阿拉善盟| 汝州市| 天全县| 新乐市| 永济市| 绥棱县|