新聞中心

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

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

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

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

本文引用地址:http://2s4d.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成員必須在類外進(jìn)行初始化(初始化格式:int base::var=10;),而不能在構(gòu)造函數(shù)內(nèi)進(jìn)行初始化,不過也可以使用const修飾的static數(shù)據(jù)成員在類內(nèi)初始化。

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

靜態(tài)成員是可以獨(dú)立訪問的,也就是說,無需創(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)化的機(jī)會。

如果沒有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() 是一個運(yùn)算符,而 strlen() 是一個函數(shù)。

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

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