一面:
- C++面向對象的三種特性?(每條詳細說說)
- C++繼承和組合?你在實際項目中是怎麼使用的?什麼情況下使用繼承?什麼情況下使用組合?
- C++構造函數可以是虛函數嗎?爲什麼?
- C++析構函數可以是虛函數嗎?爲什麼要將析構函數設置爲虛函數?
- C++如何實現多態?虛表指針是什麼時候被初始化的?實例化一個對象需要那幾個階段?(三個)
- C++偏特化?
- 重載、重寫、覆蓋?
- static關鍵字的作用?(要全面)怎麼實現的?
- inline和宏定義的區別?inline是如何實現的?宏定義是如何實現的?
- 指針和引用的區別?怎麼實現的?
- malloc和mmap的底層實現?malloc分配的是什麼?(底層詳細回答)
- Linux進程地址空間佈局?(這裏又問道虛擬內存和分頁、頁表這些東西)
- tcp的握手揮手過程?(詳細)tcp爲什麼要連接?tcp建立連接這裏你是怎麼理解的?
- 半連接隊列?全連接隊列?
- tcp流量控制和擁塞控制?
- time_wait狀態?爲什麼是2msl?
- 有很多close_wait怎麼解決?
- 阻塞和非阻塞?同步和異步?
- 五種IO模型?
- select和epoll有什麼區別?epoll的LT和ET模式?
- udp爲什麼是不可靠的?bind和connect對於udp的作用是什麼?
- NAT是什麼?底層實現原理?
- 斐波那契數列的非遞歸寫法?(寫出代碼)
- 共享桌面用你熟悉的任意畫圖工具畫項目架構圖?(我用的ProcessOn)
- 聊項目?
- 總共用時兩個小時吧,問了很多,有些已經想不起來了。
二面:
- 聊項目
-
佔多少內存?然後又扯到位域?1
2
3
4
5
6
struct
{
char
a;
short
b;
int
c;
char
d;
};
- map和unordered_map的底層實現?目前map支持map[10] = 20這種操作,其底層怎麼實現的?和insert有什麼區別?
- 一個unique_ptr怎麼賦值給另一個unique_ptr對象?(std::move)
-
這段代碼會有什麼問題?引用計數如何變化?1
2
3
int
*sp =
new
int
{10};
shared_ptr<
int
> sp1(sp);
shared_ptr<
int
> sp2(sp);
-
這段代碼打印輸出?(寫出來:四組)1
2
3
4
5
6
7
8
9
10
#include <sys/types.h>
#include <unistd.h>
pid_t pid1;
pid_t pid2;
pid1 = fork();
pid2 = fork();
cout <<
"cur pid:"
<<getpid() <<
",pid1:"
<< pid1 <<
",pid2:"
<< pid2 << endl;
- pthread_detach和pthread_join的作用?
- 殭屍進程和孤兒進程?
- 一個進程能不能綁定到一個cpu?系統調用接口是什麼?線程呢?
- 對於使用tcp通信的兩端,如果client已經退出,此時服務端繼續send會出現什麼問題?這個當然就要扯到SIGPIPE信號了?
- 一個整數數組,可能是降序或升序,也可能是先升序再降序,求最大值?(幾秒後就讓我趕緊說思路)
- 寫代碼:單鏈表,求中部的N個節點的頭節點和尾節點?(需要寫測試用例)
三面:
- 爲什麼離職?
- 聊項目?
- 一致性hash?能不能用到你剛纔的項目中?
- c語言的函數調用棧底層詳細說說?
- static變量存放在哪裏?什麼時候分配的內存?(這裏感覺面試官優點不太清楚,我就詳細說了說)
- k-v數據庫如果get有百分之80的數據都不命中怎麼解決?
- 緩存穿透問題怎麼處理?
- map的底層實現?zset的底層實現?爲什麼zset不使用紅黑樹作爲其底層實現?爲什麼map不使用跳錶作爲其底層實現?
- 寫道題吧:非遞歸求二叉樹的高度?(需要寫測試用例)
不得不說hr的效率是真的高,一天時間走完offer審批流程!