劍指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等等