C++面試題整理 1

robot2017發表於2024-09-12

1. new和malloc什麼區別?

new和malloc都用於在堆上分配記憶體,new是c++中的關鍵字,分配記憶體後還會呼叫建構函式

2. std中unorded_map,map,multimap有什麼區別?

  • unorderd_map中元素不按鍵值排序,底層資料結構是雜湊表,相對map查詢速度快,記憶體開銷大
  • map中元素按鍵值排序,底層資料結構是紅黑樹,相對unorderd_map,查詢速度慢,記憶體開銷小
  • multimap類似map,但是允許重複鍵值

3. C++中左值和右值的概念,以及使用右值常見的場景

簡單來說,對於一個賦值表示式而言, 左側的稱之為左值,右側的稱之為右值。左值一般為常見的定義過的變數,在棧或堆上有具體的儲存空間,右值一般為臨時物件,作用域只限於賦值表示式期間。右值常見的有數字/字元常量,函式返回的非引用值,臨時構造的物件。

4. C++記憶體洩漏怎麼出現,如何定位與解決

記憶體洩漏是由於在堆上new出來的空間,沒有delete釋放掉導致的。可以透過過載new/delete加入log資訊,比較申請和釋放的記憶體,從而得知是否有記憶體洩漏;也可以透過各種檢測工具,Windows下有UMDH,Linux下有valgrind工具

5. 解釋下linux下虛擬地址空間

作業系統為了解決多程序管理中安全和效率問題,為每個程序分配的是虛擬記憶體地址,各記憶體地址相互隔離。在 Linux 作業系統中,虛擬地址空間的內部又被分為核心空間和使用者空間兩部分,使用者空間又分為棧,堆,資料,程式檔案等。

  • 參考連結
    知乎-如何理解虛擬地址空間
    CSDN-徹底搞懂虛擬記憶體,虛擬地址,虛擬地址空間

6. 同步/非同步與阻塞/非阻塞的區別

同步指的一條指令執行完,再執行下一條執行,各指令按照順序依次執行,非同步指的是,兩條指令可以同時執行。阻塞指的是一個執行緒需要等待另一個執行緒的結果時,阻止當前執行緒繼續向下執行,而非阻塞則是不阻止當前執行緒。

7. 有哪些架構型別

單體架構、分散式應用、微服務與Serverless

  • 參考連結
    騰訊雲-四種常見的系統架構,目前你處於哪個階段呢?

相關文章