1. 程式人生 > >劍指C++面試

劍指C++面試

傳聞公司老總欠下鉅款,帶著小姨子跑路了~  樹倒猢猻散,接下來三個月,要好好準備面試,以期找到一份滿意的工作。

面試準備分下面幾個方面進行:

 

1.C++語言基礎

傳統C++:

虛擬函式必知必問(父子類構造析構順序、父類解構函式應該宣告為virtual嗎) 、多重繼承類成員在空間中的分佈、四類轉型操作符(reinterpret_cast等)使用場景、static關鍵字的作用、虛擬函式表的佈局(菱形繼承的缺點以及每個物件的空間分佈)

現代C++:

auto關鍵字、左值與右值、移動語義與完美轉發、for-each迴圈、智慧指標(std::shared_ptr、std::unique_ptr實現細節)、RAII概念、STL容器的emplace_back、執行緒庫std::thread+std::mutex+std::conditon_variable+std::lock_forward、lambda捕獲、std::bind+std::function等(待補充)

 

2.演算法與資料結構基礎

1)排序(快速排序>氣泡排序>歸併排序>桶排序),給出實現原理,分析演算法複雜度、最好最壞情況下的複雜度。

2)二分查詢使用場景

3)連結串列的建立、插入、刪除、查詢、翻轉、連線,演算法需儘量寫出來,注意邊界檢查、空指標、函式返回連結串列頭部指標以建立引用等

4)佇列與棧  

佇列涉及消費者-生產者模型、多執行緒同步等

棧的問題通常結合函式呼叫展開。比如printf函式為什麼不能宣告為 stdcall方式

5)雜湊表(問的比較多)

雜湊衝突的檢測、雜湊插入函式實現、

6)樹

紅黑樹 概念 左旋右旋的方式、分析查詢和插入時的平均演算法複雜度、最好最壞時的演算法複雜度,涉及STL中的MAP

B樹問的較少,變形問題:MySQL 索引實現原理

7)其他的一些演算法

A*尋路,霍夫曼編碼等

 

3.編碼基本功

程式設計素養如編碼風格、計算機英語水平、除錯能力等(除錯能力是大牛必備)

基礎編碼題如實現memmove、strcopy、atoi等

 

4.多執行緒開發基礎

知道何時新建執行緒、如何建立和等待執行緒、執行緒與程序的關係、執行緒區域性儲存、多執行緒競態的產生和避免(死鎖處理)

熟悉日常開發平臺所屬作業系統的執行緒同步原語(CriticalSection、Event、Mutex、Sempored、WaitForSingleObject、WaitForMultipleObject)

 

5.資料庫

①傳統關係型資料庫

1)基本sql操作如增刪改查(Insert、delete、update、select)、排序(order)、條件查詢(where子句)、限制查詢結果數量(limit語句)

2)  高階點的sql操作如(Group by,in,join,left join,多表聯合查詢,別名使用,select子語句等)

3)資料庫本身的操作,建庫建表、資料的匯入匯出

4)SQL優化技巧(非重點)

②記憶體資料庫(redis):

這麼說吧,熟悉redis是後臺開發的基本要求了。

1)基礎用法:redis的基礎資料型別、資料持久化、事務等

2)redis原始碼層面:redis的網路通訊模型、redis各種資料結構的實現

redis本身就是一個非常值得學習的開原始碼庫

 

6.網路程式設計

select函式用法、非阻塞connect函式寫法、阻塞socket與非阻塞socket區別、send/recv函式的返回值情形、reuse_addr選項等。Windows平臺上的WSAEventSelect、

WSAAsyncSelect函式用法、完成埠(IOCP)模型。

更深入的一些知識點有:

1)nagle演算法

2)keeplive選項

3)Linger選項(在http中send完後是否立即close socket)

4)處理大量CLOSE_WAIT或TIME_WAIT

5)通訊協議如何設計或如何解決資料包的粘包與分片問題

6)心跳機制如何設計(如何檢查死鏈)

7)斷線重連機制如何設計

8)對IO Multiplexing技術的理解

9)如何正確收發資料包,收發緩衝區如何設計

10)優雅關閉

11)定時器如何設計

12)流量擁塞與控制機制

13)tcp與udp的區別與適用場景

14)http中的GET/POST區別

 

7.專案經驗總結

專案整體的架構圖、負責處理的模組、解決過什麼難以排查的bug等等