網易社招面試(牛客上的面經,找了答案記錄下來)

1.struct和union的區別
1)在任何同一時刻, union存放一個被選中的成員, 而struct存放所有的成員變量。
2)對於union的不同成員賦值,將會對其他成員重寫, 原來成員的值就不存在了, 而對於struct的不同成員賦值是互不影響的
3)內存分配不同
union的大小爲其內部所有變量的最大值,按照最大類型的倍數進行分配大小。
struct分配方法類似,也是按照最大類型的倍數進行分配大小,但是還與順序有關。
Struct 和 Union 的詳細區別

2.虛函數的作用及實現原理
虛函數的作用:實現類的多態性。
實現原理:虛表指針+虛函數表。每個類使用一個虛函數表,每個類對象用一個虛表指針。
虛函數的作用及其底層實現機制

3.局部變量、全局變量、常量還有malloc開闢的內存變量分別放在哪個區
在C/C++中內存分爲5個區,分別爲棧區、堆區、全局/靜態存儲區、常量存儲區、代碼區。
局部變量:棧區
全局變量:全局/靜態存儲區
常量:常量儲存區。const修飾的全局變量也儲存在常量區,const修飾的局部變量依然在棧上。
malloc開闢的內存變量:堆區
C語言:內存分配

4.STL中Vector、List、Map底層實現
vector:底層實現是數組。連續存儲的容器,動態數組,在堆上分配空間。
list:底層實現是雙向鏈表。動態鏈表,在堆上分配空間。
map和set都是C++的關聯容器,其底層實現都是紅黑樹。

5.智能指針相比普通指針的優勢
智能指針使用了一種RAII(資源獲取即初始化)的技術對普通的指針進行封裝。
1)可以防止忘記釋放。
2)異常安全。在一段進行了try/catch的代碼段裏面,即使你寫入了delete,也有可能因爲發生異常,程序進入catch塊,從而忘記釋放內存,這些都可以通過智能指針解決。
3)智能指針可以把指針的value語義轉化爲reference語義。
如何理解智能指針

6.select和epoll的區別
1)支持一個進程所能打開的最大連接數
select單個進程可監視的fd數量被限制,即能監聽端口的大小有限。32位機默認是1024個。64位機默認是2048.
epoll雖然單個進程連接數有上限,但是很大。可以達到10W以上。
2)FD劇增後帶來的IO效率問題
select因爲每次調用時都會對連接進行線性遍歷,所以隨着FD的增加會造成遍歷速度慢的“線性下降性能問題”。
因爲epoll內核中實現是根據每個fd上的callback函數來實現的,只有活躍的socket纔會主動調用callback,所以在活躍socket較少的情況下,使用epoll沒有前面兩者的線性下降的性能問題,但是所有socket都很活躍的情況下,可能會有性能問題。
3)消息傳遞方式
select內核需要將消息傳遞到用戶空間,都需要內核拷貝動作。
epoll通過內核和用戶空間共享一塊內存來實現的。
4)select只支持LT(水平觸發)。epoll既支持LT又支持ET(邊緣觸發),默認是LT。
select和epoll的區別

7.ET和LT模式的區別和可能的問題。
LT模式:在數據到達後,無論程序是沒有接收,還是接收了但沒有接收完,下一輪epoll_wait仍然會提醒應用程序該描述符上有數據,直到數據被接受完。(設置爲阻塞和非阻塞都可以)
ET模式:在數據到達後,無論程序是沒有接收,還是接收了但沒有接收完,都只提醒一次,下一輪不再提醒應用程序該描述符上有數據。(只能設置爲非阻塞)
爲什麼epoll的ET模式只能設置爲非阻塞?
ET 模式是一種邊沿觸發模型,在它檢測到有 I/O 事件時,通過 epoll_wait 調用會得到有事件通知的文件描述符,每於每一個被通知的文件描述符,如可讀,則必須將該文件描述符一直讀到空,讓 errno 返回 EAGAIN 爲止,否則下次的 epoll_wait 不會返回餘下的數據,會丟掉事件。而如果你的文件描述符如果不是非阻塞的,那這個一直讀或一直寫勢必會在最後一次阻塞。
LT模式與ET模式

8.單向鏈表中如何高效刪除一個結點(只給定頭指針和指向當前結點的指針)
因爲沒有當前傳入節點的上一個節點,因此,需要想一個折中的辦法,由於上一個節點知道它的下一個節點就是當前傳入的節點,因此我們將當前節點中的所有信息換成當前節點的下一個節點的信息,也就變相的完成了節點的刪除。
刪除單向鏈表中的某個節點

9.給定n個正整數,如何找出最小的K個正整數
通過快排的思路解決

10.給定一組整數1000以內,如何高效去除重複的數
通過哈希映射的思路解決

11.main函數執行前後會執行什麼代碼
入口函數和初始化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章