常用基礎知識面試(C++為主)

雨果66666發表於2018-08-04

挺多家公司面試都問相關基礎問題(C++為主),有的時候一緊張老答不全,趕緊列出來,每天背三遍,吾日三省吾身。

1.引用和指標的區別
①指標是一個實體,需要分配記憶體空間;引用只是變數的別名,不需要分配記憶體空間。
②引用在定義的時候必須進行初始化,並且不能夠改變。指標在定義的時候不一定要初始化,並且指向的空間可變。
③指標和引用的自增運算結果不一樣。(指標是指向下一個空間,引用時引用的變數值加1)。
④sizeof 引用得到的是所指向的變數(物件)的大小,而sizeof 指標得到的是指標本身的大小。
⑤引用訪問一個變數是直接訪問,而指標訪問一個變數是間接訪問。
⑥有多級指標,但是沒有多級引用,只能有一級引用。

2.const int * ptr與 int * const ptr的區別
①const int * ptr是指該指標指向一個const int,即指標的指向可以改變,而指標指向的內容不可以發生改變。
②int * const ptr是指改指標的指向不能發生改變了,但是它指向的內容卻可以發生改變。

3.C++的儲存區(5個)
①棧:區域性變數,函式引數等儲存在該區,由編譯器自動分配和釋放。
②堆:需要程式設計師手動分配和釋放(new,delete),屬於動態分配方式。
③全域性/靜態儲存區:全域性變數,靜態變數分配到該區,到程式結束時自動釋放,包括DATA段(全域性初始化區)與BBS段(全域性未初始化段)。
④文字常量區:存放常量,而且不允許修改。程式結束後由系統釋放。
⑤程式程式碼區:存放程式的二進位制程式碼。

4.C++ 中 new 與 malloc 的區別
① new/delete是C++關鍵字,需要編譯器支援。malloc/free是庫函式,需要標頭檔案支援。
② 引數:使用new操作符申請記憶體分配時不是必須指定記憶體塊的大小,編譯器會根據型別資訊自行計算。而malloc則需要顯式地指出所需記憶體的尺寸。
③ 返回型別:new操作符記憶體分配成功時,返回的是物件型別的指標,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。而malloc記憶體分配成功則是返回void * ,需要通過強制型別轉換將void*指標轉換成我們需要的型別。
④ 記憶體分配失敗時:new記憶體分配失敗時,會丟擲bac_alloc異常。malloc分配記憶體失敗時返回NULL。
⑤ 過載:new允許過載,malloc不允許
⑥ 記憶體區域:new操作符從自由儲存區(free store)上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體。

5.程式和執行緒的區別
①程式和執行緒的定義分別是?
程式:是執行中一段程式,即一旦程式被載入到記憶體中並準備執行,它就是一個程式。程式是表示資源分配的的基本概念,又是排程執行的基本單位,是系統中的併發執行的單位。
執行緒:單個程式中執行中每個任務就是一個執行緒。執行緒是程式中執行運算的最小單位。
②一個執行緒只能屬於一個程式,但是一個程式可以擁有多個執行緒。多執行緒處理就是允許一個程式中在同一時刻執行多個任務。
③執行緒是一種輕量級的程式,與程式相比,執行緒給作業系統帶來側建立、維護、和管理的負擔要輕,意味著執行緒的代價或開銷比較小。
④執行緒沒有地址空間,執行緒包含在程式的地址空間中。執行緒上下文只包含一個堆疊、一個暫存器、一個優先權,執行緒文字包含在他的程式 的文字片段中,程式擁有的所有資源都屬於執行緒。所有的執行緒共享程式的記憶體和資源。 同一程式中的多個執行緒共享程式碼段(程式碼和常量),資料段(全域性變數和靜態變數),擴充套件段(堆儲存)。但是每個執行緒擁有自己的棧段, 暫存器的內容,棧段又叫執行時段,用來存放所有區域性變數和臨時變數。

6.程式間通訊的方法(5種):
① 管道
② 命名管道(FIFO)
③ 訊息佇列
④ 訊號量
⑤ 共享記憶體

7.執行緒間通訊的方法:
① 使用全域性變數進行通訊
② 使用自定義訊息
std::promise 可以用來線上程間提供資料傳遞。
std::future = std::promise.get_future()
執行緒中可以對promise賦值std::promise.set_value
賦值之後std::future.get()就會返回其他執行緒中設定的
std::packaged_task 可以包裹一個函式, 有點類似std::function,不同之處在於這個可以通過get_future返回std::future物件來獲取非同步執行的函式結果。

相關文章