<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          分享7道最近常問(wèn)的嵌入式面試題

          作者: 時(shí)間:2024-04-09 來(lái)源: 收藏

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

          本文引用地址:http://www.ex-cimer.com/article/202404/457326.htm


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

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

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

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

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

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

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

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

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


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


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

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

          一般用處:

          · 并行設(shè)備的硬件寄存器(如狀態(tài)寄存器):存儲(chǔ)器映射的硬件寄存器通常也要加 voliate,因?yàn)槊看螌?duì)它的讀寫(xiě)都可能有不同意義。

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

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

          · 一個(gè)參數(shù)既可以是const還可以是volatile嗎?可以的,例如只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭?/span>它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。

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


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


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

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

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

          · sizeof() 可以用于任何類(lèi)型的數(shù)據(jù),而 strlen() 只能用于以空字符 '看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();