幾個嵌入式面試題 自己的經歷

2021-05-22 14:19:58 字數 4765 閱讀 8597

一. new 和 malloc 的區別

1,malloc 與 free 是 c++/c 語言的標準庫函式, new/delete 是 c++ 的運算子。它們都可用於申請動態記憶體和釋放記憶體。

2, 對於非內部資料型別的物件而言,光用 maloc/free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於 malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於 malloc/free 。

3, 因此 c++ 語言需要乙個能完成動態記憶體分配和初始化工作的運算子 new ,以乙個能完成清理與釋放記憶體工作的運算子 delete 。注意 new/delete 不是庫函式。

4,c++ 程式經常要呼叫 c 函式,而 c 程式只能用 malloc/free 管理動態記憶體

new 是個操作符 , 和什麼 "+","-","="... 有一樣的地位 .

malloc 是個分配記憶體的函式 , 供你呼叫的 .

new 是保留字 , 不需要標頭檔案支援 .

malloc 需要標頭檔案庫函式支援 .

new 建立的是乙個物件 ,

malloc 分配的是一塊記憶體 .

new 建立的物件你可以把它當成乙個普通的物件 , 用成員函式訪問 , 不要直接訪問它的位址空間

malloc 分配的是一塊記憶體區域 , 就用指標訪問好了 , 而且還可以在裡面移動指標 .

簡而言之:

new   是乙個操作符,可以過載     ; malloc 是乙個函式,可以覆蓋     ;

new   初始化物件,呼叫物件的建構函式,對應的 delete 呼叫相應的析構函式   

malloc 僅僅分配記憶體, free 僅僅**記憶體   

二. class( 類 ) 與 struct (結構體)的區別

從語法上,在 c++ 中(只討論 c++ 中)。 class 和 struct 做型別定義時只有兩點區別:

(一)預設繼承許可權。如果不明確指定,來自 class 的繼承按照 private 繼承處理,來自 struct 的繼承按照 public 繼承處理;

(二)成員的預設訪問許可權。 class 的成員預設是 private 許可權, struct 預設是 public 許可權。

除了這兩點, class 和 struct 基本就是乙個東西。語法上沒有任何其它區別。

不能因為學過 c 就總覺得連 c++ 中 struct 和 class 都區別很大,下面列舉的說明可能比較無聊,因為 struct 和 class 本來就是基本一樣的東西,無需多說。但這些說明可能有助於澄清一些常見的關於 struct 和 class 的錯誤認識:

( 1 )都可以有成員函式;包括各類建構函式,析構函式,過載的運算子,友元類,友元結構,友元函式,虛函式,純虛函式,靜態函式;

( 2 )都可以有一大堆 public/private/protected 修飾符在裡邊;

( 3 )雖然這種風格不再被提倡,但語法上二者都可以使用大括號的方式初始化: a a = ; 不管 a 是個 struct 還是個 class ,前提是這個類 / 結構足夠簡單,比如所有的成員都是 public 的,所有的成員都是簡單型別,沒有顯式宣告的建構函式。

( 4 )都可以進行複雜的繼承甚至多重繼承,乙個 struct 可以繼承自乙個 class ,反之亦可;乙個 struct 可以同時繼承 5 個 class 和 5 個 struct ,雖然這樣做不太好。

( 5 )如果說 class 的設計需要注意 oo 的原則和風格,那麼沒任何理由說設計 struct 就不需要注意。

( 6 )再次說明,以上所有說法都是指在 c++ 語言中,至於在 c 裡的情況, c 裡是根本沒有 「class」 ,而 c 的 struct 從根本上也只是個包裝資料的語法機制。

最後,作為語言的兩個關鍵字,除去定義型別時有上述區別之外,另外還有一點點: 「class」 這個關鍵字還用於定義模板引數,就像 「typename」 。但關鍵字 「struct」 不用於定義模板引數。

三. class 中 static 加與不加的區別

靜態資料成員

在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態成員是類的所有物件中共享的成員,而不是某個物件的成員。

使用靜態資料成員可以節省記憶體,因為它是所有物件所公有的,因此,對多個物件來說,靜態資料成員只儲存一處,供所有物件共用。靜態資料成員的值對每個物件都是一樣,但它的值是可以更新的。只要對靜態資料成員的值更新一次,保證所有物件訪問更新後的相同的值,這樣可以提高時間效率。

靜態資料成員的使用方法和注意事項如下:

1 、靜態資料成員在定義或說明時前面加關鍵字 static 。

2 、靜態成員初始化與一般資料成員初始化不同。靜態資料成員初始化的格式如下:

< 資料型別 >< 類名 >::< 靜態資料成員名 >=< 值 >

這表明:

(1) 初始化在類體外進行,而前面不加 static ,以免與一般靜態變數或物件相混淆。

(2) 初始化時不加該成員的訪問許可權控制符 private , public 等。

(3) 初始化時使用作用域運算子來標明它所屬類,因此,靜態資料成員是類的成員,而不是物件的成員。

3 、靜態資料成員是靜態儲存的,它是靜態生存期,必須對它進行初始化。

4 、引用靜態資料成員時,採用如下格式:

< 類名 >::< 靜態成員名 >

如果靜態資料成員的訪問許可權允許的話 ( 即 public 的成員 ) ,可在程式中,按上述格式來引用靜態資料成員。

靜態成員函式

靜態成員函式和靜態資料成員一樣,它們都屬於類的靜態成員,它們都不是物件成員。因此,對靜態成員的引用不需要用物件名。

在靜態成員函式的實現中不能直接引用類中說明的非靜態成員,可以引用類中說明的靜態成員。如果靜態成員函式中要引用非靜態成員時,可通過物件來引用。

四. vi 的自動排版與 縮排

當然也可以輸入 ggvg=

gg 將游標移到檔案第一行第一列

v 切換模式為可視模式

g 表示將游標移到檔案末尾

上面相當於將檔案內容全選,

=實現自動排版

當然也可以修改配置檔案進行設定。

使用自動縮排可能需要設定,下面介紹調整縮排的方法:

插入狀態

ctrl-t 右縮 ; ctrl-d 左縮 ; ^ctrl-d 刪除行首空格

命令狀態下左右縮排

>>

右縮排

<<

左縮排

n<< 或 n>>

縮排多行,如 4>>

可視狀態下的縮排

使用 < 或 > 進行縮排,也可使用 n< 或 n> 多節縮排

可以用 = 對選中的部分進行自動縮排。

五 . 什麼是交叉編譯

在一種計算機環境中執行的編譯程式,能編譯出在另外一種環境下執行的**,我們就稱這種編譯器支援交叉編譯。這個編譯過程就叫交叉編譯。簡單地說,就是在乙個平台上生成另乙個平台上的可執行**。這裡需要注意的是所謂平台,實際上包含兩個概念:體系結構( architecture )、作業系統( operating system )。同乙個體系結構可以執行不同的作業系統;同樣,同乙個作業系統也可以在不同的體系結構上執行。舉例來說,我們常說的 x86 linux 平台實際上是 intel x86 體系結構和 linux for x86 作業系統的統稱;而 x86 winnt 平台實際上是 intel x86 體系結構和 windows nt for x86 作業系統的簡稱。

有時是因為目的平台上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特徵;有時是因為目的平台上的資源貧乏,無法執行我們所需要編譯器;有時又是因為目的平台還沒有建立,連作業系統都沒有,根本談不上執行什麼編譯器。

交叉編譯這個概念的出現和流行是和嵌入式系統的廣泛發展同步的。我們常用的計算機軟體,都需要通過編譯的方式,把使用高階計算機語言編寫的**(比如 c **)編譯( compile )成計算機可以識別和執行的二進位制**。比如,我們在 windows 平台上,可使用 visual c++ 開發環境,編寫程式並編譯成可執行程式。這種方式下,我們使用 pc 平台上的 windows 工具開發針對 windows 本身的可執行程式,這種編譯過程稱為 native compilation ,中文可理解為本機編譯 。然而,在進行嵌入式系統的開發時,執行程式的目標平台通常具有有限的儲存空間和運算能力,比如常見的 arm 平台,其一般的靜態儲存空間大概是 16 到 32mb ,而 cpu 的主頻大概在 100mhz 到 500mhz 之間。這種情況下,在 arm 平台上進行本機編譯就不太可能了,這是因為一般的編譯工具鏈( compilation tool chain )需要很大的儲存空間,並需要很強的 cpu 運算能力。為了解決這個問題,交叉編譯工具 就應運而生了。通過交叉編譯工具,我們就可以在 cpu 能力很強、儲存控制項足夠的主機平台上(比如 pc 上)編譯出針對其他平台的可執行程式。

要進行交叉編譯,我們需要在主機平台上安裝對應的交叉編譯工具鏈( cross compilation tool chain ),然後用這個交叉編譯工具鏈編譯我們的源**,最終生成可在目標平台上執行的**。常見的交叉編譯例子如下:

1 、在 windows pc 上,利用 ads ( arm 開發環境),使用 armcc 編譯器,則可編譯出針對 arm cpu 的可執行**。

2 、在 linux pc 上,利用 arm-linux-gcc 編譯器,可編譯出針對 linux arm 平台的可執行**。

3 、在 windows pc 上,利用 cygwin 環境,執行 arm-elf-gcc 編譯器,可編譯出針對 arm cpu 的可執行**。

嵌入式面試題

15 typedef 在c語言中頻繁用以宣告乙個已經存在的資料型別的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子 define dps struct s typedef struct s tps 以上兩種情況的意圖都是要定義dps 和 tps 作為乙個指向結構s指標。哪種方法更好呢?...

嵌入式面試題

1.main int ptr int a 1 printf d d a 1 ptr 1 這段程式的輸出是 a 2 2 b 2 1 c 2 5 d 以上均不是 2.考查自加操作 main 這段程式的輸出是 a i 4 j 2 b i 3 j 2 c i 3 j 4 d i 3 j 6 3.此題考查的是...

嵌入式面試題

以下是我找嵌入式面試時遇到的一些問題,答案以後慢慢補充。1.incline和巨集定義的區別 3.linux自旋鎖 4.程序,執行緒的概念 5.strcpy的使用,具體實現 6.雙向鍊錶的插入,刪除 7.大端小端概念 8.寫一段c程式檢測cpu是32位還是64位 9.malloc和new的使用 10....