在這裏提供一下本身複習的東西吧,我也就把這個東西給搞了一遍,而後面試基本沒啥問題了,若是問的很深的話,那就只能只求多福了兄弟!其中可能有一些錯誤或者因爲編譯環境有差別請你們自動忽略這些錯誤。 linux
1:信號的生命週期?面試
信號產生-》信號在進程中註冊-》信號在進程中的註銷-》執行信號處理函數 算法
2:信號的產生方式?數組
(1)當用戶按某些終端鍵時產生信號(2)硬件異常產生信號【內存非法訪問】(3)軟件異常產生信號【某一個條件達到時】(4)調用kill函數產生信號【接受和發送的全部者必須相同,或者發送的進程全部者必須爲超級用戶】(5)運行kill命令產生信號 瀏覽器
3:信號處理方式?安全
(1)執行默認處理方式(2)忽略處理(3)執行用戶自定義的函數 服務器
4:如何消除隱式轉換?cookie
使用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