我的大廠面試經歷(附100+面試題干貨)


在這里提供一下自己復習的東西吧,我也就把這個東西給搞了一遍,然后面試基本沒啥問題了,如果問的很深的話,那就只能只求多福了兄弟!其中可能有一些錯誤或者由於編譯環境有差異請大家自動忽略這些錯誤。

1:信號的生命周期?

  信號產生-》信號在進程中注冊-》信號在進程中的注銷-》執行信號處理函數 

2:信號的產生方式?

  (1)當用戶按某些終端鍵時產生信號(2)硬件異常產生信號【內存非法訪問】(3)軟件異常產生信號【某一個條件達到時】(4)調用kill函數產生信號【接受和發送的所有者必須相同,或者發送的進程所有者必須為超級用戶】(5)運行kill命令產生信號 

3:信號處理方式?

  (1)執行默認處理方式(2)忽略處理(3)執行用戶自定義的函數 

4:如何消除隱式轉換?

  使用explicit關鍵字進行修飾 

5:重載,重寫和隱藏的區別?

  重載:即函數重載 

  重寫【覆蓋】:即用於虛函數 

  隱藏:只要派生類的函數名與基類相同就會隱藏 

6:volatile表示什么?有什么作用?

  易變的,不會被編譯器進行優化,讓程序取數據直接去內存中的。 

7:Static_cast<>,dynamic_cast<>,const_cast<>,reinterpret_cast<>的各自作用和使用環境?

  Static_cast:能完成大部分轉換功能,但是並不確保安全 

  Const_cast:無法從根本上轉變類型,如果是const,它就依舊是const,只是如果原對象不是const,可以通過此轉換來處理,針對指針和引用而言。 

  Dynamic_cast:針對基類和派生類指針和引用轉換,基類和派生類之間必須要繼承關系,是安全的 

  Reinterpret_cast:允許將任何指針類型轉為其他指針類型,是安全的 

8:Malloc和new的區別?

  New: 

  內存分配錯誤時,拋出bad_alloc異常,可以定義set_new_handler函數來在產生異常時進行處理;本身是一個運算符;分配內存的地方為自由存儲區【為一個抽象概念】;對於對象而言,會先申請內存空間然后調用構造函數;無需指定大小 

  Malloc: 

  內存分配錯誤時,返回NULL;本身是一個庫函數;分配內存的地方為堆;只申請內存空間;需要指定申請多大的內存; 

9:free和delete的區別?

  Delete: 

  本身是一個運算符 

  Free: 

  本身是一個庫函數 

10:free一個數組時如何知道要釋放多大的內存呢?

  一般在數組前面幾個字節中存在某一個結構體來保存當前申請的數組大小。 

11:__stdcall和__cdecl的區別?

  __stdcall: 

  從右往左壓棧,堆棧參數數據由函數本身清除,一般是通過匯編指令ret x,x表示彈出x個字節,參數必須是確定,必須為函數本身知曉,所以此關鍵字不能用於有可變參數應用的函數聲明。 

  __cdecl: 

  從右往左壓棧,由調用者來對堆棧數據進行清除,步驟:調用方調用函數-》函數執行-》函數結果返回-》調用方清除堆棧參數,主要針對可變參數 

12:linux內部提供了那些調試宏?

  __FILE__:表示在哪個文件 

  __LINE__:表示在當前多少行 

  __FUNCTION__:表示在執行在哪個函數 

13:手寫線程安全的單例模式?


 

14:引用和指針的區別?

  指針:是一個變量類型;指針可以不進行初始化;指針初始化后可以改變,在寫代碼時需要大量的檢測 

  引用:是一個別名;引用必須要初始化;引用初始化后不可改變,無需檢測 

15:出現異常時,try和catch做了什么?

  Catch(Ep a)發生異常-》建立一個異常對象-》拷貝一個異常對象-》catch處理 

  Catch(Ep &a)發生異常-》建立一個異常對象-》引用異常對象-》catch處理 

  異常對象通常建立在全局或者堆中【需要在函數外進行捕捉】 

  Catch捕捉異常的轉換:異常處理時,如果用基類的處理派生類的對象會導致派生類完全當做基類來使用,即便有虛函數也沒用,所以派生類必須放在基類前處理。 

16:C++如何處理多個異常的?

  多次catch處理 

17:常對象的成員變量一定不可以修改嗎?為什么?

  可以修改,用mutable來修飾,可以突破const的限制。 

18:虛函數的調用過程?

  找到對象內存中vfptr所指向虛函數表的地址-》找到虛函數表相應的虛函數地址 

19:匯編層面:

  Mov ecx, dword ptr[ebp-0ch]將this指針放進ecx 

  Mov edx, dword ptr[ecx]將虛表的地址放進edx 

  Call dword ptr[edx+4]:調用虛表中函數 

  虛函數放置順序與聲明順序一樣,成員變量也是 

  虛表中放的不是函數的入口地址,而是一個jmp跳轉指令的地址 

20:單繼承,多繼承,菱形繼承,虛繼承時,對象內存中的差異區別?如果存在虛函數呢?

  單繼承: 


 

  多繼承: 


 

菱形繼承:


 

 

21:實現一個vector?是1.5還是2倍,各有什么優缺點?

1.5倍優勢:可以重用之前分配但是釋放的內存

  2倍劣勢:每次申請的內存都不可以重用 

22:map底層用了什么?

  紅黑樹 

23:如果用map刪除了一個元素,迭代器還能用嗎?為什么?怎樣做可以接着用?

  能用,a.erase(it ++);因為是直接申請的內存,所以可以直接通過獲取后續節點來處理 

24:紅黑樹的特征是什么?

  (1)根節點為黑色(2)一個節點為紅色,子節點必定為黑色(3)從任意一點觸發到達每一個葉子節點的黑色節點個數相同(4)每一個節點不是紅色就是黑色(5)每一個葉子節點都是黑色 

25:紅黑樹如何插入和刪除的?

  插入: 

  (1)如果父節點為黑色,直接插入不處理 

  (2)如果父節點為紅色,叔叔節點為紅色,則父節點和叔叔節點變為黑色,祖先節點變為紅色,將節點操作轉換為祖先節點 

  (3)如果當前節點為父親節點的右節點,則以父親結點為中心左旋操作 

  (4)如果當前節點為父親節點的左節點,則父親節點變為黑色,祖先節點變為紅色,以祖先節點為中心右旋操作 

  刪除: 

  (1)先按照排序二叉樹的方法,刪除當前節點,如果需要轉移即轉移到下一個節點 

  (2)當前節點,必定為這樣的情況:沒有左子樹。 

  (3)刪除為紅色節點,不需要處理,直接按照刪除二叉樹節點一樣 

  (4)如果兄弟節點為黑色,兄弟節點的兩個子節點為黑色,則將兄弟節點變為紅色,將着色轉移到父親節點 

  (5)如果兄弟節點為紅色,將兄弟節點設為黑色,父親結點設為紅色節點,對父親結點進行左旋操作 

  (6)如果兄弟節點為黑色,左孩子為紅色,右孩子為黑色,對兄弟節點進行右旋操作 

  (7)如果兄弟節點為黑色,右孩子為紅色,則將父親節點的顏色賦值給兄弟節點,將父親節點設置為黑色,將兄弟節點的右孩子設為黑色,對父親節點進行左旋 

26:紅黑樹和B+,B-的區別?

  紅黑樹的深度比較大,而B+和B-的深度則相對要小一些,而B+較B-則將數據都保存在葉子節點,同時通過鏈表的形式將他們連接在一起。 

27:線程同步幾種方式?

  互斥鎖,信號量,臨界區 

28:手寫strcpy,memcpy,memmove函數?

  需要注意內存重疊問題 

29:Do{}while(0)的用法有哪些?

  (1)可以將語句當做一個獨立的域(2)對於多語句可以正常的運行(3)可以有效的消除goto語句,達到跳轉語句的效果 

30:手寫快排?時間復雜度?空間復雜度?能進行優化嗎?還有嗎?能進行尾遞歸優化嗎?

  最優時間復雜度:nlogn 

  最差時間復雜度:n^2 

  平均時間復雜度:nlogn 

  空間復雜度:logn -> n 

  優化: 

  (1)隨機(2)三數取中(3)當排序達到一定長度時用插入排序(4)分隔一次后,將相同數據不處理(5)使用並行或者多線程(6)進行尾遞歸優化【即將logn降解為更低的復雜度】 

31:線程池的作用是什么?

  處理線程多並發,用一個數組保存線程,然后一直放着,如果沒用就用條件變量讓它休眠,如果加入一個新的任務就喚醒其中一個去執行這個任務。 

Pthread_cond_signal和pthread_cond_broadcast的區別

  Pthread_cond_signal表示喚醒睡眠線程中的一個【單播,可能按照優先級或者先來后到的原則】 

  Pthread_cond_boardcast表示喚醒所有睡眠線程【廣播】 

  線程有幾種狀態?進程又有幾種狀態? 

線程:


 

  進程: 


 

 

32:TCP三次握手和四次揮手及各自的狀態?

  三次握手: 

  CLOSE          LISTEN 

  SYN_SENT 

  SYN_RCVD 

  ESTABLISHED 

  ESTABLISHED 

  四次揮手: 

  FIN_WAIT1 

  CLOSE_WAIT 

  FIN_WAIT2 

  LAST_ACK 

  TIME_WAIT 

  CLOSE 

  CLOSE 

33:TCP如果兩次握手會出什么問題?那三次握手又會造成什么問題?有什么好的解決方法沒?

  兩次握手:客戶端發送的連接請求可能在網絡中滯留了,如果沒有三次握手,可能會再次創建一個連接。 

  三次握手:引起SYN flood 

  不斷發送同步報文段會因為傳輸控制模塊TCB【處於半連接狀態】從而消耗服務器資源 

  (1)【處理連接和半連接】定時釋放監控系中無效的連接 

  (2)Syn ***技術【處理半連接狀態】,接受到的SYN先不創建TCB,而是用一個hash表來表示,當前連接,如果接收到ACK然后再創建TCB 

  (3)Syn cookie技術【處理連接】通過一個cookie值來確定當前連接是否合法,合法就連接,一般的驗證方法是,服務器接受到一個syn包,服務器通過syn產生一個cookie數據作為初始化序列,接收到ACK包時,序列-1就是得到的cookie,然后進行相應的驗證。 

34:TCP四次揮手為什么要有TIME_WAIT狀態?為什么?

  有兩個原因: 

  (1)保證TCP協議全雙工連接能夠可靠關閉,直接關閉的話,如果服務器沒有收到ACK,會重復發FIN。 

  (2)保證這次連接的重復數據從網絡中消失,如果上次的socket和這次的socket處理的程序一樣,就會導致這次連接把上次的數據加進來了。 

35:死鎖的原因?條件?如何預防?又如何避免?如何解除?

  原因:系統資源不足;進程運行推進順序不合適;資源分配不當 

  條件:互斥;不剝奪;循環等待;請求與保持 

  預防:破壞任意一個條件 

  避免:銀行家算法 

  檢測:資源分配圖簡化法 

36:排序穩定的算法,你知道那些?

  冒泡排序;插入排序;歸並排序;基數排序 

37:解決hash沖突的方法?

  線性探測法;開鏈法;再哈希法; 

38:C++分為內存分為哪幾部分?

  堆;棧;靜態全局;常量;自由存儲區 

39:如果new申請內存失敗了,如何去解決?如果讓你實現一個new,你會怎么實現?

  如果申請失敗可以通過set_new_handler來進行處理。 

  實現:需要注意申請失敗,如果相應的處理函數則調用,否則拋出bad_alloc異常 

40:如何得到一個結構體內成員的偏移量?


 

 

41:進程與線程的區別?

  (1)進程又自己的獨立地址空間,線程沒有 

  (2)進程是資源分配的最小單位,線程是CPU調度的最小單位 

  (3)進程和線程通信方式不同 

  (4)進程切換上下文開銷大,線程開銷小 

  (5)一個進程掛掉了不會影響其他進程,而線程掛掉了會影響其他線程 

  (6)對進程進程操作一般開銷都比較大,對線程開銷就小了 

42:逐層打印二叉樹?

  用BFS隊列 

43:構造函數能不能虛函數?為什么?那拷貝構造函數能不能為虛函數?為什么?

  不可以為虛函數,因為在調用構造函數時,虛表指針並沒有在對象的內存空間中,必須要構造函數調用完成后才會形成虛表指針。 

  拷貝構造函數是構造函數所以理由同上。 

44:析構函數能不能虛函數?為什么?

  可以為析構函數,沒有為什么 

45:模板和實現可不可以不寫在一個文件里面?為什么?

  只能寫在一個一個頭文件中。 

  原因:多文件處理變為一個文件其實是通過鏈接器來實現的,所以如果用源文件來處理模板實現,會導致鏈接失效,最主要的原因還是在編譯,編譯器會暫時不處理模板類只有在實例化對象時才去處理,但是這就需要實現的代碼了,如果放在其他文件的話,就會無法形成相應的類。 

46:什么是RAII資源管理?

  即資源獲取就是初始化,利用對象生命周期來控制程序資源,簡單來說就是通過局部對象來處理一些資源問題 

47:為什么要字節對齊?

  (1)有些特殊的CPU只能處理4倍開始的內存地址 

  (2)如果不是整倍數讀取會導致讀取多次 

  (3)數據總線為讀取數據提供了基礎 

48:在成員函數中調用delete this會出現什么問題?對象還可以使用嗎?

  如果當前內存空間真正被釋放了再次調用成員函數會報錯,調用成員變量好像沒有問題。 

49:如果在構造函數中調用memset(this, 0, sizeof(*this))來初始化內存空間,有什么問題嗎?

  對於有虛函數和虛表存在的類,在進行memset后不能調用虛函數和虛基表繼承而來的數據和函數 

50:對一個數組而言,delete a和delete[] a有什么區別?為什么?

  對於基礎數據類型沒有什么區別,對於對象delete值調用一次析構函數,delete[]才會析構所有的東西。 

51:Dynamic_cast是如何實現運行時類型轉換的?

  如果有些虛函數的話,會到對應的虛表中的RTTI去查找對應的類型來判斷可不可以進行相應的轉換。 

52:C語言調用C++語法函數怎么做?那C++調用C語法的函數怎么做?

  使用extern “C”來產生C語言環境編譯的程序供外部使用。 

53:Extern “C”是什么意思?他有什么作用?

  表示當前聲明需要用C語言環境進行編譯。 

54:進程間的通信方式有哪些?線程間的通信方式呢?

  進程:共享內存,消息隊列傳遞,無名管道,有名管道,信號,套接字 

  線程:鎖機制,信號量,信號 

55:IO模型主要有哪些?

  阻塞,非阻塞,IO多路復用,異步 

56:阻塞和非阻塞?同步與異步的區別?

  自己領悟 

57:Select,poll和epoll的區別?為什么?

  Select和poll缺點:(1)每次調用select都需要將fd集合從用戶態拷貝到內核態(2)每一次調用select都需要在內核中遍歷所有的fd(3)select支持的文件描述符太小,默認1024,poll沒有限制 

  Epoll:使用紅黑樹來存儲fd,同時每一次通過epoll__ctl來將fd加入內核中,同時通過雙向列表來返回已經出發某一個事件的fd 

  手寫如何通過一個結構體的成員變量得到一個結構體的地址? 


 

 

58:Struct{char a[0];}的作用?有什么好處?

  充當可變緩沖區的作用,同時char a[0]不占用內存空間。 

59:如何判斷兩個浮點數相等?

  需要考慮浮點誤差 

60:浮點數為什么會有誤差?

  因為二進制無法精准的表示十進制小數,0.3和0.2都無法完整的用二進制表示。 

61:TCP的nagle算法和延遲ack,還有CORK呢?他們有什么好處?一起用會有什么效果?你覺得可以有什么改進?

  nagle算法:防止網絡中存在太多小包而造成網絡擁塞 

  延遲ack:減少ACK包的頻繁發送 

  CORK:將多個包變成一個包發送,提高網絡利用率,使載荷率更大 

  不可一起使用 

62:棧上分配內存和堆上分配內存有什么區別?

  棧上:分配簡單,只需要移動棧頂指針,不需要其他的處理 

  堆上:分配復雜,需要進行一定程度清理工作,同時是調用函數處理的。 

63:變量的存儲方式有哪些?

  Auto,extern,register,static 

64:線程私有和共享那些資源?進程私有和共享那些資源?

  線程私有:線程棧,寄存器,程序寄存器 

  共享:堆,地址空間,全局變量,靜態變量 

  進程私有:地址空間,堆,全局變量,棧,寄存器 

  共享:代碼段,公共數據,進程目錄,進程ID 

65:什么是守護進程?如何查看守護進程?什么是僵屍進程?如何查看僵屍進程?

  守護進程:一個生命周期長,並且控制終端,然后周期性執行某種任務的進程 

  查看守護進程:ps a敏感詞> 

  僵屍進程:進程退出,但是占用資源沒有被回收 

  查看僵屍進程:ps -ef|grep defunct 

66:進程同步機制?

  信號量;管程; 

67:什么是信號?

  進程間通信機制中唯一的異步通信機制 

68:kill函數的每一個參數的作用?

  Pid>0:發給ID為pid的進程 

  Pid=0:發給進程組所有的進程 

  Pid=-1:發給所有的進程 

  Pid<-1:發給指定進程組的進程 

69:什么是協程?

  用戶態的輕量級線程,有自己的寄存器和棧 

70:虛擬內存實現有哪幾種方式?有什么意義?

  三種:請求分頁存儲管理;請求分段存儲管理;請求段頁式存儲管理 

71:什么是類型安全?能舉例嗎?

  兩個類型直接進行轉換,必須是顯式的,string和STL模板是類型安全的 

72:確保線程安全的幾種方式?

  (1)原子操作(2)同步與鎖(3)可重入(4)阻止過度優化volatile 

73:OSI七層模型?

  應用層;表示層;會話層;傳輸層;網絡層;數據鏈路層;物理層; 

74:TCP/IP五層模型?

  應用層;傳輸層;網絡層【路由器】;數據鏈路層【交換機、網橋、網卡】;物理層【中繼器、集線器】; 

75:DHCP協議是什么?使用什么端口?他的優劣?

  DHCP協議:動態主機配置協議 

  客戶端端口:68;服務端端口:67 

  說說DHCP協議執行的過程? 

  DHCP discover廣播-》 

  《-DHCP offer廣播 

  DHCP request-》 

  《-DHCP ack 

  在0.5T和0.875T會嘗試新的租用,服務器不同意則返回nack否則是ack; 

  如果發生IP沖突則返回DHCP decline。 

76:網絡序是大端還是小端?為什么要這樣?

  大端,歷史遺留問題 

77:ping命令使用的是什么協議?

  ICMP協議 

78:路由表一般包含什么?

  (1)網絡地址(2)網絡掩碼(3)網關【下一跳服務器】(4)躍點數【距離】 

79:停止等待協議的缺點?為什么?

  信道利用率太低,每次都需要等上一次ACK包接收到了才能再次發送 

80:擁塞控制的方式?具體怎么做的?快重傳的時機是什么?

  (1)慢開始(2)擁塞避免(3)快重傳【收到3個失序分組確認】(4)快恢復 

81:DNS協議如何實現將域名解析為IP地址的?

  (1)客戶機的應用程序調用解析程序將域名已UDP數據報的形式發給本地DNS服務器 

  (2)本地DNS服務器找到對應IP以UDP形式放松回來 

  (3)弱本地DNS服務器找不到,則需要將域名發送到根域名服務器,根域名服務器返回下一個要訪問的域名服務器,則訪問下一個域名服務器。 

82:創建進程的步驟?

  (1)申請空的PCB(2)為新進程分配資源(3)初始化PCB(4)將新進程插入就緒隊列中 

83:進程切換發生的原因?處理進程切換的步驟?

  原因:中斷發生;更高優先級進程喚醒;進程消耗完了時間片;資源阻塞; 

  步驟:(1)保存處理器的上下文(2)用新狀態和其它相關信息更新正在運行進程的PCB(3)將原來的進程移到合適的隊列中【就緒,阻塞】(4)選擇另外一個執行的進程,更新被選中進程的PCB,將它加載進CPU 

84:虛函數表是在什么時候確定的?那虛表指針呢?

  編譯時確定虛函數表,虛表指針則是運行時 

85:如何檢查內存泄露?如果不通過printf,debug等調試方式和編譯器報錯提示呢?

  使用GDB調試器 

86:Int(*f(int,void(*)()))(int,int)是什么意思?

  一個函數,參數為int和指向返回值為void的無參數的函數指針,返回值為一個指向返回值為int,參數為int和int的函數指針 

87:STL空間配置器如何處理內存的?能說一下它的大概實現方案嗎?為什么是8bytes的倍數?

  分為兩部分:大於128bytes用malloc直接申請,小於128bytes則使用一個8bytes倍數的數組來進行申請。 

  為8bytes的原因是為了提高效率,同時對於64位的機器而言,地址大小為8bytes 

88:HTTP 403表示什么?

  權限不夠 

89:靜態函數能定義為虛函數嗎?為什么?

  不可以,因為虛函數屬於對象,不屬於類 

90:靜態函數能定義為常函數嗎?為什么?

  不可以,因為常函數是操作成員變量的,而靜態函數沒有成員變量可說 

91:知道什么是冪等性嗎?舉個例子?

  其任意多次執行所產生的影響均與一次執行的影響相同。 

92:當接受方的接受窗口為0時還能接受數據嗎?為什么?還能接受什么數據?那怎么處理這些數據呢?

  可以接受。 

  數據:零窗口探測報文;確認報文段;攜帶緊急數據的報文段 

  可能會被拋棄 

93:當接受方的返回的接受窗口為0時,發送方會進行什么操作?

  開啟計時器,發送零窗口探測報文 

94:請求頁面置換策略有哪些方式?他們的區別是什么?各自有什么算法解決?

  全局和局部; 

  全局:在整個內存空間置換 

  局部:在本進程中進行置換 

  全局:(1)工作集算法(2)缺頁率置換算法 

  局部:(1)最優算法(2)FIFO先進先出算法(3)LRU最近最久未使用(4)時鍾算法 

95:系統調用與函數調用的區別?

  (1)一個在用戶地址空間執行;一個在內核空間執行 

  (2)一個是過程調用,開銷小;一個需要切換用戶空間和內核上下文,開銷大 

  (3)一般相同;不同系統不同 

96:對於默認處理的結構體,能用memcmp來進行比較嗎?為什么?如果不能,該如何比較?

  不能,因為字節對齊多出來的內存是隨機的,必須要一個個成員比較 

97:C++中有哪些機制可以取代宏?

  Inline,typedef,const 

98:手寫一個有可變參數的函數?

  使用va_list,va_start,va_arg,va_end。 

  也可以用宏定義##__VA_ARGS__,可以針對空參數消除逗號 

99:可靠信號與不可靠信號的區別?

  一個會丟失,另外一個則會用隊列來保存相應的事件 

100:this指針調用成員變量時,堆棧會發生什么變化?

  將相應的參數從右往左壓棧,然后將this指針放到寄存器中 

101:實現一個shared_ptr類和auto_ptr類?

  Shared_ptr則是引用計數處理,auto_ptr則是權限轉移機制 

102:下面這兩個函數在執行過程中有什么區別?

  Int f(string&a); f(“abc”);//報錯 

  Int f(const string&a); f(“abc”);//正常 

103:C++中可以繼承string類嗎?為什么?

  不可以,因為string不是類 

104:Char * const *(*next)()是什么?

  next是一個指針,指向一個函數,這個函數返回一個指針,這個指針指向char類型的常量指針 

105:訪問一個網頁的過程,計算機發生了什么?

  (1)先找DNS 

  (2)建立TCP連接 

  (3)發送HTTP報文 

  (4)接受HTTP報文 

  (5)瀏覽器解析顯示 

106:如何判斷const所修飾的對象?

  const只修飾其后的【變量】,至於const放在類型前還是類型后並沒有區別 

  突然發現忘了最重要的東西了,祝各位能夠得到心儀的offer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM