新聞中心

        EEPW首頁 > 設計應用 > 分享7道最近常問的嵌入式面試題

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

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

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

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


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

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

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

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

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

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

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

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

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


        2. 關鍵字voliate作用和含義/使用場景?


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

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

        一般用處:

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

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

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

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

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


        3. sizeof和strlen的區別,使用場景?


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

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

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

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

        主站蜘蛛池模板: 青河县| 龙门县| 通城县| 赫章县| 石台县| 宁强县| 科尔| 襄樊市| 沅陵县| 白银市| 永济市| 塘沽区| 通辽市| 和田县| 拜城县| 沐川县| 扶沟县| 菏泽市| 乐安县| 大兴区| 陇西县| 姚安县| 界首市| 四子王旗| 唐海县| 浪卡子县| 凉山| 罗山县| 通道| 章丘市| 宁强县| 保德县| 平乐县| 巩留县| 桦甸市| 广州市| 眉山市| 云南省| 镇巴县| 阿克| 丰宁|