Q:TCP/IP編程服務器端主要調用哪些接口
A:bind listen connect send read write等等
Q:select/poll/epoll的區別
A:三種IO多路複用 epoll性能更高,節省更多開銷
Q:recv函數的返回值及其意義
A:當應用程序調用recv函數時,
(1)recv先等待socket的發送緩衝中的數據被協議傳送完畢,如果協議在傳送socket的發送緩衝中的數據時出現網絡錯誤,那 麼recv函數返回SOCKET_ERROR,
(2)如果socket的發送緩衝中沒有數據或者數據被協議成功發送完畢後,recv先檢查套接字socket的接收緩衝區,如果接收緩衝區中沒有數據或者協議正在接收數據,那麼recv就一直等待,直到協議把數據接收完畢。當協議把數據接收完畢,rec函數就把socket的接收緩衝中的數據copy到buffer中(注意協議接收到的數據可能大於buf的長度,所以 在這種情況下要調用幾次recv函數才能把socket的接收緩衝中的數據copy完。recv函數僅僅是copy數據,真正的接收數據是協議來完成的),rec函數返回其實際copy的字節數。如果recv在copy時出錯,那麼它返回SOCKET_ERROR;如果recv函數在等待協議接收數據時網絡中斷了,那麼它返回0。
Q:進程之間通訊有哪幾種方式?
A:無名管道(父子間)、有名管道(無親緣關係也可以)、消息隊列(消息的鏈表)、信號量(計數器,一種同步手段)、信號、共享內存、套接字等等
Q:進程和線程的優缺點,各適用於什麼場合?
A:進程優點:使任務併發執行;每個進程互相獨立不影響;容易擴充性能
進程缺點:邏輯控制複雜;調度開銷大
線程優點:無需跨進程邊界;程序邏輯和控制方式簡單;所有線程可以直接共享內存和變量
線程缺點:一個線程的崩潰可能影響到整個程序的穩定性;調度開銷大,性能擴充難
多線程比多進程成本低,但性能更低,線程適用於對性能要求不高的場合
Q:extern "C"的作用
A:指示編譯器這部分代碼按C語言的進行編譯,更好地支持舊代碼
Q:map和hash_map的區別
A:map的基礎數據結構是紅黑樹,hash_map的基礎數據結構是哈希表,hashmap的查詢時間複雜度比較低,適合記錄比較多的情況
Q:非遞歸求二叉樹的深度搜索
A:使用隊列,加個level變量++深度增加
Q:Top K海量數據查找
A:先通過Hash法,把這1億個數字去重複,然後創建最小堆,比較、替換堆頂元素再重新調整爲最小堆,直至遍歷完
Q:基類的析構函數必須爲虛函數嗎?
A:如果確定程序中有基類指針指向派生類的問題,則必須將基類的析構函數指定爲虛函數,否則不需要
Q:vector list 區別
A:vector和數組類似,list用雙向鏈表實現,它們的區別就是數組/鏈表的區別
Q:單鏈表找環
A:保存遍歷過的節點(空間更少方法:一邊遍歷一邊反轉鏈表(翻轉指針),如果有環會掉頭走回頭結點)
Q:靜態鏈接庫和動態鏈接庫的區別
A:靜態:函數代碼直接鏈接進目標程序;動態:程序運行的時候再從DLL中尋找相應函數代碼
靜態執行速度略比動態鏈接庫快
動態更加節省內存,提高了可維護性和可擴展性,適合大規模開發
Q:一個C++程序從編譯到運行都經歷了哪些階段
A:編譯預處理->編譯->優化程序->彙編程序->鏈接程序->可執行文件
Q:觀察者模式
A:觀察者設計模式定義了對象間的一種一對多的組合關係,以便一個對象的狀態發生變化時,所有依賴於它的對象都得到通知並自動刷新(“註冊——通知——撤銷註冊”)
Q:大端法和小端法指的是什麼
A:最高有效字節在最前面的方式稱爲大端法,小端法相反
Q:判斷兩個鏈表有沒有交點
A:如果他們相交的話,那麼他們最後的一個節點一定是相同的