秋招基礎知識盤點

秋招快要結束了,忙活了三個月左右,把三年學的東西都整合了一遍相當,遇到了很多問題吧,這篇博客記錄我學的關於c++等等的基礎知識,目的一是以後需要的時候方便些,二是希望可以幫到以後找工作的學弟學妹們。順便攢攢人品吧,祝願10月拿到心儀的offer

本篇博客基本是以目錄形式將秋招的基本問題給出,不可能是像百科全書一樣答案都會給出來,僅僅是秋招中筆試面試常碰到的問題我將其進行了歸納,既可以用於學習,不會的進行查資料學會,又可以等學完所有再來進行溜一遍

 

一、C:

  1. 類型轉換(static_cast,const_cast,dynamic_cast,reinterpret_cast)//強轉,將const轉爲非const(取出const),類之間,重解釋
  2. 算符優先級:(前導->單目->雙目->三目->賦值->逗號)  (雙目:算數->移位->關係->邏輯)
  3. 宏定義:#ifndef   or     #pragma once
  4. 數組以及二維數組每個變量含義,定義
  5. 字符數組和char*的區別(1、sizeof,2、常量與變量,3、代碼區和棧區)
  6. 結構體,聯合體,字節對齊
  7. 堆與棧區別(1、申請方式,2、分配方式,3、大小(堆比棧理論上大),4、效率)
  8. const與#define區別(1、const有類型檢查,#define單純替換,2、多次用到const更省空間)
  9. 發生緩衝區溢出的幾種情況:(1、數組越界,2、未分配空間,3、分配空間未回收)
  10. static(1、生命週期:到程序結束,2、只在當前源文件有效,3、不支持extern拓展,4、存儲在全局區,5、未初始化默認爲0)
  11. strcat效率問題及改進(提供一個新參數,提供前面字符串結尾位置)
  12. 預編譯(又叫預處理,完成頭文件的展開以及宏定義的替換)
  13. fseek(調整文件指針的位置)
  14. ~(該符號後面加變量會隱式轉換爲int類型)
  15. 判斷非零整數x二進制表示下,有多少bit是1(x&(x-1))
  16. printf中參數同時出現a++和++a:(遇到a++會記錄此時a的值爲最後輸出結果,遇到a和++a則不會將此時的計算結果作爲最終輸出,只會修改a的值,在最終輸出的時候都輸出a的值(所以++a和a的結果是一樣的))
  17. volatile const(這裏面要注意一個變量同時被這兩個關鍵字進行修飾,和變量與只用const修飾的區別)
  18. 前,中,後綴表達式:(中綴轉前後綴:二叉樹解決。前綴轉中綴:從右向左入棧。後綴轉中綴:從左向右入棧)
  19. extern(1、不能包含對應的文件(重定義),2、聲明方式(extern+類型+變量),3、函數默認是帶有extern的)
  20. sizeof(1、返回值隱式轉換爲無符號整型,2、爲一個整型表達式,而非函數)
  21. 短路原則(||    &&)

二、c++

  1. c和c++區別(1、面向過程和麪向對象,2、new和malloc以及delete和free、3、cin,cout和printf,scanf,4、缺省參數,5、函數重載(底層的命名規範不同))
  2. c++的class,struct(1、默認權限,2、默認繼承方式,3、class可以定義模板函數,struct不行)
  3. 類和對象(類:具有相同屬性和方法的個體的抽象。對象:與類的關係類似於數據類型和變量)
  4. 類和對象實例化(靜態建立:A a,動態建立:A *pa = new A();)
  5. 如何創建一個類只能建立在堆(棧)上:(堆:1、西貢設爲私有,2、1是無法解決繼承問題的,可將構造析構都設爲保護權限,然後定義兩個static public類型函數進行構造析構。棧:將operator new()設爲私有即可)
  6. 類六個默認成員(1、構造,2、析構,3、拷貝構造,4、賦值運算符重載,5、取地址運算符重載,6、const修飾的取地址運算符重載)
  7. 異常(c:斷言,assert,errno,c++:1、try,catch,throw,2、派生自公共基類exception的標準異常,3、異常處理函數)
  8. 初始化列表(1、初始化列表優先於構造函數(爲啥?多調用了一次構造函數)2、哪些成員必須在初始化列表初始化:1、const(只能初始化列表初始化,不能賦值),2、引用,3、構造體內未初始化值的)
  9. 拷貝構造:(1、必須引用傳參,2、深淺拷貝,3、應用場合(1、用一個已有對象創建一個新對象,2、傳參參數的對象,3、返回值對象))
  10. explicit(防止隱式調用構造函數)
  11. 賦值運算符重載(賦值運算符與拷貝構造區別(拷貝構造:用一個已有對象初始化準備創建的對象,賦值:對已有的對象進行拷貝賦值))
  12. const(1、成員函數用const修飾是在後面,2、常對象只能使用長函數,3、const函數更加的安全)
  13. static(1、所有成員共享一份,2、成員變量類外初始化,3、可以直接類名作用域調用,4、靜態函數內部只能調用靜態成員變量,5、不可以繼承,6、不支持虛函數,7、線程函數只能爲靜態函數)
  14. 友元(1、友元函數不是類的成員函數,2、不能繼承,3、不支持虛函數,4、可以通過對象使用該類的所有成員,5、一定程度破壞了封裝性)
  15. inline(1、inline對於編譯去只是個建議,編譯器自己選擇是否將該函數當作內聯函數,2、編譯期編譯器對函數調用的地方進行展開,沒有開闢棧空間的開銷,3、定義在類內部的成員函數默認爲內聯函數,4、debug下無真正的內聯,release才實現了真正的內聯,5、不支持虛函數,6、函數體內代碼較長或出現循環等其他複雜結構建議不要用)
  16. new/delete的調用過程(1、new/delete(new(1、調用operator new()分配空間,2、調用構造函數初始化對象),delete(1、調用析構函數清理對象,2、用operator delete)),2、new[](1、調用operator new[]開闢所需空間再加四四個字節的空間;前四個字節存放數組個數,然後使頭指針向後偏移四個字節,調用N次構造初始化),delete[](頭指針再向前四個字節開始,一次性調用operator delete釋放空間)ps:只有當自定義類型且顯示自定義析構函數時編譯器纔會多開四字節存放元素個數)
  17. 繼承(菱形繼承相關問題(解決方法:虛繼承(虛基表的推出)))
  18. 多態(靜態聯編:編譯時決定(重載,模板),動態聯編:運行時決定(虛函數,協變(協變是指返回值必須是父子關係的指針或引用)))
  19. 純虛函數,抽象類,接口類
  20. 模板(原理:編譯器的推演,實例化後生成對應代碼,還有一堆東西)
  21. 引用(1、引用是對應變量內存地址的別名,2、指針與引用的區別(1、初始化,2、++,--,3、sizeof,4、原理),3、引用不一定消耗內存空間,c++沒有規定引用底層實現,看編譯器實現)
  22. 靜態成員函數和內聯函數不能是虛函數,友元函數和構造函數不能是虛函數,但是析構可以
  23. 用老代碼實現新需求:應該遵循開閉原則,儘量不改變原有代碼,而應利用結構寫一段新代碼
  24. A* obj = new B()  如果obj->虛函數,則從對象B的虛表找,如果obj->普通函數,則從A類型中找該函數
  25. 構造函數和析構函數中調用虛函數採用靜態聯編
  26. #define和const的區別:(1、編譯器處理方式不同(define預處理,const編譯運行),2、類型檢查,3、存儲方式不同(define不分配內存,const會),4、const可以節省空間,5、提高了效率,6、有些調試工具可以對cosnt進行測試,而不會對define進行測試)
  27. 頂層const和底層const(const int* p:底層const,int* const p :頂層const。區別:1、底層const不可以賦值給普通指針,頂層可以,2、類型轉換函數const_cast只能改變底層const)
  28. final和override(都只能修飾虛函數)
  29. extern “c”
  30. STL相關
  31. c++內存管理,內存池技術
  32. c++類中的數據成員和成員函數內存分佈
  33. this指針
  34. 構造函數幾個關鍵字(default,delete,0)
  35. 對象複用和零拷貝
  36. decltype()和auto
  37. 智能指針
  38. c++11新特性

三、網絡

  1. 通過DNS對域名進行解析,過程如下:
    先查瀏覽器緩存,查系統緩存,查路由器緩存、查ISP緩存、沒有就按照DNS服務器的搜索邏輯從根域名服務器開始遞歸搜索,最終得到一個IP地址,此時客戶端瀏覽器發起一個http會話,轉交運輸層
  2. http請求行,請求頭,請求正文,請求行有get,post等等方面的東西
  3. 爲啥進行網絡分片:數據鏈路層有最大傳輸單元MTU的特性,它限制了數據幀的最大長度,當要傳輸的IP報文超過MTU時,就分片
  4. 什麼時候發RST包:1、建立連接,SYN了,對方端口沒開。2、服務器崩了,在客戶端發現服務器崩潰之前就重啓了,之前的連接信息都沒了,服務器就發個RST。3、TCP想取消一個已有的連接,這可能會造成RST攻擊
  5. RST攻擊:1、A和B正常通信,C僞造A發個RST,B就斷開連接。2、A和B正常通信,C僞造A發個SYN,B認爲A已經瘋了,主動發個RST
  6. tcp,udp,ip頭
  7. tcp與udp的區別
  8. udp優點:發送數據之前不需要建立連接,不需要維護複雜的鏈接狀態表,只有八個字節的首部開銷,網絡擁塞不會使發送速率降低
  9. tcp爲啥可靠:
    三次握手,四次揮手,爲啥不能是兩次三次,以及最後的time_wait用2MSL(1、確定已發送的數據在網絡中消失,2、以及確認對方已經收到我的關閉命令),握手第三次丟了咋整(發送RTS,並CLOSED,防止SYN flood)
    面向字節流:以流的形式傳輸緩存區滿了就劃分爲幾段進行傳輸
    流量控制:控制發送方的發送速率(停止-等待,滑動窗口)
    重傳(超時重傳,快重傳,sack)
    擁塞控制:慢啓動,擁塞避免,快重傳,快恢復
  10. 網頁解析的過程與實現方法
    應用層: 通過DNS對域名進行解析,過程如下:
    先查瀏覽器緩存,查系統緩存,查路由器緩存、查ISP緩存、沒有就按照DNS服務器的搜索邏輯從根域名服務器開始遞歸搜索,最終得到一個IP地址,此時客戶端瀏覽器發起一個http會話,轉交運輸層
    運輸層: 建立TCP連接,傳數據
    網絡層: 查路由表,轉發IP數據報
    數據鏈路層: 使用ARP協議找到MAC地址轉發,數據幀
    回覆:
    瀏覽器向WEB服務器發送了一個Http請求,服務器返回相應數據給客戶端,瀏覽器拿到響應數據後開始解析:
    1.解析html文檔,邊解析邊顯示
    2.遇到引用外部css文件或者圖片,瀏覽器發送請求給服務器,拿到對應的css文件和圖片資源,這個請求不會影響html的加載
    3.碰到js時,則等待直到js加載和解析完畢,才恢復html渲染。
  11. OSI七層

四、操作系統

  1. 進程線程的聯繫區別(1、調度:資源分配的基本單位,獨立完成任務的基本單位。2、擁有資源:線程擁有少部分必不可少的資源(線程ID,當前指令指針PC,寄存器集合以及堆棧)。3、系統開銷:創建進程與撤銷進程所需要的系統開銷很大,線程則比較小)
  2. 進程的組成:1、進程控制塊(PCB),2、程序段,3、數據段
  3. 進程通信:管道(共享文件),socket,共享內存,剪切板,消息隊列
  4. (互斥)臨界區遵循的原則:1、空閒讓進,2、忙則等待,3、有限等待,4、讓權等待
  5. 信號量:是一個二元組(s,q),s是非負初值的整型變量,q是一個初始狀態爲空的隊列,s表示系統中某類資源的數目,P/V操作,P(wait),V(signal)
    同一個信號量可以被系統的同一個線程獲取,之後由另一個線程釋放;而互斥量則要求那哪個線程獲取的互斥量,哪個進程要釋放這個互斥量
  6. 死鎖與活鎖的概念,
  7. 死鎖產生的必要條件:1、互斥條件,2、不剝奪條件,3、請求與保持條件4、環路等待條件
  8. 死鎖的預防:1、不太好,2、對於一個已經獲得資源的進程,若新的資源請求不能立即得到滿足,則它必須釋放所有已經獲得的資源,劣勢:不適應剝奪資源之後代價較大的場合。3、預先靜態分配法(進程在運行之前一次性給他分配所有需要的資源,劣勢:降低資源的利用率)。4、有序資源分配法,給每個資源編號,只能申請編號之後的資源,不能申請之前的資源了,不會出現互相請求的資源形成環的情況了,不過由於對各種資源編號後不宜修改,從而限制了新設備的增加,而且會造成資源浪費,對資源按序使用也會增加程序編寫的複雜性
  9. 死鎖的檢測:發現死鎖的原理是考察某一時刻系統狀態是否合理,是否可以
  10. 餓死:正常IO密集型線程比CPU密集型線程要更受歡迎,但如果一個CPU密集型線程獲得較高的優先級的時候,有些IO密集型線程就會一直等待,如果很長時間都不能獲得執行,則會餓死,解決方法就是逐步提升等待時間過長的得不到執行的線程的優先級
  11. 分段和分頁的區別:1、頁是信息的物理單位,段是信息的邏輯單位。2、頁有內部碎片,無外部碎片,段有外部碎片,無內部碎片。3、頁的大小是固定的且由系統決定的,段的長度不固定,不同段有不同的段長
  12. 段頁式雖無外部碎片,但是內部碎片要比頁式分配多一些
  13. 缺頁中斷:系統發現自己請求的頁面找不到了,就會發生缺頁終端,在外存中找尋需求的資源,如果內存有空閒的話,將這段外存中的東西放進內存裏
  14. 頁面置換算法,當內存不夠用的時候,我們需要將內存換到外存裏面,常用的有最近最少使用(LRU),以及先進先出(FIFO)
  15. I/O模型:1、阻塞,2、非阻塞,3、多路I/O,4、信號驅動I/O,5、異步I/O

五、數據庫

  1. 視圖:是一張虛擬表,並不真實存在(相當於封裝起來的sql語句。爲什麼?1、安全:有些表數據是私密的。2、高效:複雜的連接查詢效率比較低)
  2. 索引:提供服務器快速在表中查詢一行數據的數據結構,可以比作數據的目錄,像是在圖書館找一本書,默認數據結構爲B-TREE,適用於表數據量夠大,增刪改較少的表,索引需要單獨開闢空間進行維護
  3. 索引缺點:1、索引創建維護耗費時間,隨數據量增加而增加。2、索引棧物理空間,如果建立聚簇索引,需要的空間會更大。3、對錶中數據增刪改,索引也需要維護
  4. 事務:是指作爲一個基本工作單元執行的一系列sql語句的操作,要麼完全的執行,要麼完全的都不執行
  5. ACID:(1、原子性。2、一致性。3、隔離性(其他事務不可見)。4、持久性(事務提交,所做的修改會永遠保存到數據庫,事務的存在是解決操作過程的ACID問題))
  6. 觸發器:是由時間來觸發某個操作,在insert,update等,當數據庫系統執行這些時間時,會激活促發其執行相應的操作(作用:1、數值達到一定要求,進行特定處理。2、寫入數據表前,強制檢驗或轉換數據。3、觸發器發生錯誤時,移動的結果會被撤銷)
  7. 遊標:是一種能從包括多條數據記錄的結果中每次提取一條記錄的機制。遊標充當指針的作用,儘管能便利結果中的所有行,但它一次值指向一行
  8. 存儲過程:實際上是封裝在服務器的一段sql代碼片段,已經編譯了的代碼,客戶端去調用存儲過程,執行效率很高
  9. 存儲引擎:InnoDB,Myisam(主要這兩種)
  10. InnoDB:是事務型數據庫的首選引擎,支持ACID,其他存儲引擎都是非事務安全表,支持行鎖定和外鏈,mysql5.5之後默認使用InnoDB。    特點:支持事務處理,支持外鍵,支持崩潰修復和併發控制,如果對事務完整性要求高(銀行)或要求實現併發控制(售票),那麼InnoDB有很大優勢
  11. Myisam:基於Isam存儲引擎,他在web數據倉庫最常使用,有較高的插入,查詢速度,但不支持事務,不支持外鍵。    特點:插入數據塊,空間和內存使用比較低,如果表只爲了插入數據和讀數據,那麼Myisam會實現處理的高效率,對完整性,併發性較低也可以使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章