一篇大佬寫的嵌入式C語言知識點萬字總結(jié)
1433
2025-04-02
mark自牛客網(wǎng)上的成電大佬面經(jīng)。
2020秋招應屆生,非科班,無實習,準備了半年,拿到了鵝廠和菊廠的提前批開發(fā)崗offer。在此,非常感謝牛客網(wǎng)提供的平臺和各位大佬的相助,分享一篇C++學習路線和學習項目反饋牛客網(wǎng),希望對大家有幫助。
作為非科班轉(zhuǎn)行C++的大多數(shù)小伙伴來說,一開始更多的關注點是不知道怎么準備,不知道看什么,想知道面試官考什么,然后有針對性的學。
在牛客網(wǎng)潛水這么久,很多小伙伴都在求面經(jīng),其實更多的時候面經(jīng)意義沒有特別大。這里,結(jié)合我的秋招經(jīng)歷說幾句實話:
面試官沒有一成不變的提問方式,每個部門,甚至每個組對相同職位的理解和面試的難度,廣度和深度都有不小的差異。
面經(jīng)是錦上添花,不是雪中送炭。寄希望于面經(jīng)通過面試的概率比較低,這種情況只適用特別小的公司,因為面試官就那幾個人,稍微有點規(guī)模就不適用。
只要你不停止找工作,學習永遠是無底洞,學是學不完的...不要寄希望于面試的全都會,那很難。反過來想,如果面試官問的你都能回答,那么你還有必要去這個公司嗎?
我還沒準備好,怕面試答不上來怎么辦。沒有萬事俱備的事情,等你全部準備好了才去面試,估計秋招都結(jié)束了。
沒必要把每一次面試都當做實戰(zhàn),給自己過大的壓力。有些面試可以當做實戰(zhàn)前的演練,大家都不認識,面試不好有什么關系呢?
去年3月份開學后,我確定了就業(yè)方向,打算找C++后臺開發(fā)的相關工作,但當時基礎太弱,根本不知道如何準備。經(jīng)常逛知乎,牛客網(wǎng),CSDN,每每看到一個學習資源和路線后就抓緊,如獲至寶。
資料是越存越多,如同找到了一個學習列表,但內(nèi)心更多的是焦慮多過開心。一方面找到了學習方向和路線,內(nèi)心狂喜;另一方面發(fā)現(xiàn)里面提到的知識點幾乎全都不會,不知從何看起。
現(xiàn)在回想當時為什么焦慮,是因為不會嗎?可能是,但更多的應該是,鋪天蓋地的知識點,一頭霧水,不知道從何學起。有些知識點不會,我可以學,但沒有路線,能否堅持、學習效率和學習產(chǎn)出都是未知數(shù)。
大部分學習路線都給了推薦的書,也給了知識點,但要怎么學,先學什么,后學什么,學完有什么項目可以練手檢驗?這些從回答里沒看到特別具體的。
去年秋招自己和同學一起慢慢摸索過來,在這里先把我秋招資源和總結(jié)鏈接放上,希望能對各位有用,沒有密碼,按需自取就好了。如果鏈接失效,添加個人-twomonkeyscluber反饋給我吧,牛客網(wǎng)回復消息不太及時:
C++學習路線配套電子書
鏈接:https://pan.baidu.com/s/1-crKMt7yFTWkJRPBpNuXgA
提取碼:flp5
C++學習路線配套視頻
鏈接:https://pan.baidu.com/s/1tri7oj_R_J4QU__8RjZq7w
提取碼:emtp
C++知識點總結(jié)
github鏈接:https://github.com/twomonkeyclub/BackEnd
C++服務器項目
項目鏈接:https://github.com/qinguoyi/TinyWebServer
下面是我自己準備C++的學習路線,只針對初學者,不是長期職業(yè)發(fā)展,不是長期職業(yè)發(fā)展,不是長期職業(yè)發(fā)展!!!
講道理,前期可以根據(jù)某個路線看,后期很難將四部分割裂開,具體到哪段時間只看哪部分是不現(xiàn)實,也是不合理的,都是交叉進行。
這里分為四個部分來介紹,可以當做早期的路線進行學習,依次是C++語言,計算機基礎知識,項目基礎知識和項目實踐。
語言
語言部分,我平時做圖像處理的項目有接觸到C++,但大都在關注圖像算法,語言特性關注很少。基本都是在用C++寫C,沒有用到任何面向?qū)ο蟮臇|西,全是面向過程。
所以,在備戰(zhàn)秋招的時候,語言相當于重新學習了一遍。我不會推薦大家一上來就抱著C++ Primer看,這種大部頭“字典”很難一次看下去,非常容易打擊信心。建議大家從視頻入手,涉及到編程細節(jié)可以翻閱一下“字典”。我個人的學習方針是視頻為主,書籍為輔。
C++ Primer Plus
集中學習該書的1~8章,涉及C語言基礎語法及指針、結(jié)構(gòu)體的使用。
C和指針
該書全面深入的剖析了指針的概念與使用,是C語言的進階。
C++ Primer
作為C++查詢的工具書,相當于新華詞典,里面會涉及C++的很多技術細節(jié),實際工程中用到的并不會太多。平時遇到問題可以查詢該書,另外也可以作為面試的參考書。
STL源碼解析
涉及C++標準模板庫的源碼實現(xiàn),其中vector、map的實現(xiàn)需要重點關注,比如內(nèi)存分配,底層數(shù)據(jù)結(jié)構(gòu)等。
下面這張思維導圖,基本覆蓋了我所學習的語言部分。
計算機基礎知識
對于非科班轉(zhuǎn)計算機的同學來說,計算機基礎是最薄弱,也是最難深入理解的一部分。但,這部分知識,在實際工作中不會像語言那樣,學了就立馬見效,往往在語言層面所無法觸及,比較棘手的地方有用。同時,也會對我們理解C++語言的底層運行機制有幫助。
坦白講,我的水平也很弱,所學的知識,也僅僅能夠應付面試和簡單的項目。為了備戰(zhàn)秋招,我所學習的基礎知識主要包括數(shù)據(jù)結(jié)構(gòu),算法,操作系統(tǒng),計算機網(wǎng)絡和設計模式。
數(shù)據(jù)結(jié)構(gòu)
視頻為主,書籍為輔。看小甲魚的數(shù)據(jù)結(jié)構(gòu),該視頻以大話數(shù)據(jù)結(jié)構(gòu)為藍本講解,了解鏈表,棧,隊列,二叉樹,哈希表,堆等基礎的數(shù)據(jù)結(jié)構(gòu)。
算法
推薦直接刷題,先臨摹再實戰(zhàn)。推薦書籍劍指offer,左程云大神的程序員代碼面試指南;刷題網(wǎng)站推薦牛客網(wǎng)。
操作系統(tǒng)
推薦書籍學習,重點看深入理解計算機系統(tǒng)的6,7,9,10章。主要理解線程,進程,虛擬內(nèi)存及鎖機制。
計算機網(wǎng)絡
推薦書籍學習。主要理解TCP/UDP/HTTP三種協(xié)議。其中TCP/UDP以謝希仁老師的計算機網(wǎng)絡為主,HTTP以圖解HTTP協(xié)議為主。
設計模式
推薦書籍學習,大話設計模式。設計模式可以放在所有知識的最后進行學習。
下面這張思維導圖,基本覆蓋了我所學習的計算機基礎部分。
項目基礎知識
談到項目,大部分搞C++的同學會很頭痛,不像Java那樣,學完之后一堆商城啊,秒殺系統(tǒng)之類的項目可以練手。很多的時候,發(fā)現(xiàn)學完C++語言和計算機基礎知識后連個練手的東西都沒有,無從下手,更害怕面試的時候沒有項目經(jīng)驗。
我想說,你不是一個人有這種感覺,這是C++偏底層語言所決定的,但同時也是因為你學習的太底層,但凡你學一點網(wǎng)絡編程都不會有這種想法,哈哈。
如果學完了網(wǎng)絡編程,你可能會有這種錯覺,比如癡迷于即時通信,沉醉在網(wǎng)站后臺...當然了,更多時候可能會感嘆,好難,(逃。
其實,只要你有了對應的基礎,學習一個有詳細文檔的項目,并不難。這里的項目基礎知識,是所有后臺開發(fā)必備的知識,分別是Linux基礎命令,系統(tǒng)編程,網(wǎng)絡編程和數(shù)據(jù)庫。
Linux基本命令
該部分主要以看視頻為主,記住常用的即可,其余的在實際使用時即用即搜。
Linux系統(tǒng)編程
在Linux下進行編程,會涉及到與系統(tǒng)的交互,內(nèi)存訪問,需要學習Linux系統(tǒng)API用法。
網(wǎng)絡編程
視頻為主,書籍為輔。書籍先看tcp/ip網(wǎng)絡編程查漏補缺,補齊網(wǎng)絡編程基礎知識,然后看Linux高性能編程。
數(shù)據(jù)庫
視頻為主,書籍為輔。MySQL和Redis數(shù)據(jù)庫是當前面試的熱門,書籍先看MySQL必知必會,再看Redis設計與實現(xiàn)。
下面這張思維導圖,基本覆蓋了我所學習的項目基礎知識部分。
項目實踐
學C++怎么能不會網(wǎng)絡編程呢?會網(wǎng)絡編程怎么能沒有項目呢?
剛?cè)腴TC++網(wǎng)絡編程時,我們都會學習一些基礎API或者書上的回射服務器、聊天室、簡單HTTP服務器實現(xiàn)。
學完上述基礎后,大部分小伙伴都摩拳擦掌想做一個像樣項目,但看來看去也不知道該怎么入手,或者不知道一個像樣項目的框架是什么。
我建議剛開始不要上來就鉆網(wǎng)絡框架,也不適合入手成熟復雜的項目,最好是找一些基礎開源項目,根據(jù)自己的想法在其基礎上添磚加瓦或者重新寫一遍,有了這些基礎后,再談精進。
其實,對于初學者來說,最難的就是找到一個容易入門的,基礎的后臺開發(fā)項目。
這時候,很多人都會推薦推薦陳碩大佬的書和木鐸,當然還有l(wèi)inya大佬的Webserver,我也非常推薦。
相信很多同學都看到了linya大佬的服務器和chenshuo的木鐸,兩個項目都是比較完善,但相對于剛剛?cè)腴T網(wǎng)絡編程想大展身手的小伙伴來說,學習曲線比游雙的Linux高性能服務器編程要稍微陡峭一些。
這里,我建議,在讀陳大佬的書之前,可以先看一下游雙的Linux高性能服務器編程,將書上的代碼和例程跑一遍,再去看muduo,肯定會更有收獲。
C++后臺開發(fā),一般的是指服務器端開發(fā),涉及的模型有C/S模型和B/S模型。其中C/S模型更多的是關注TCP協(xié)議,服務器端和客戶端都需要自己完成,數(shù)據(jù)包也需要自己設計;B/S模型更多的關注HTTP協(xié)議,因為以瀏覽器充當客戶端,并且有現(xiàn)成的HTTP協(xié)議,所以重點在服務器端。
我們看大多數(shù)書上的講解目錄,都是先講C/S模型,再講B/S模型。相對于入門來說,書上的回射服務器和聊天室程序更容易入門和理解,但要想做一個拿得出手的C/S模型項目,個人覺得還是不容易的。
從面試做項目的角度,我個人更傾向先從簡易的B/S模型入手,然后再過渡到簡易的C/S模型。這樣我們可以跳過客戶端和數(shù)據(jù)包的設計,將更多重點放在服務器端,盡快完成一個小demo,提升初學者的信心。
在這里我將去年面試秋招時候我所準備的項目分享給大家,希望對剛?cè)腴T的小伙伴有所幫助,這個項目目前還在更新和維護。
我秋招的時候,讀完游雙的高性能Linux服務器編程后,攢了一個Linux下C++輕量級Web服務器項目(點擊這里直達)。
使用線程池 + epoll(ET和LT均實現(xiàn)) + 模擬Proactor模式并發(fā)模型
使用狀態(tài)機解析HTTP請求報文,支持解析GET和POST請求
通過訪問服務器數(shù)據(jù)庫實現(xiàn)web端用戶注冊、登錄功能,可以請求服務器圖片和視頻文件
實現(xiàn)同步/異步日志系統(tǒng),記錄服務器運行狀態(tài)
經(jīng)Webbench壓力測試可以實現(xiàn)上萬的并發(fā)連接數(shù)據(jù)交換
Linux下C++輕量級Web服務器雖然是toy級別的項目,但只要你按照README中的步驟運行,經(jīng)多個同學測試,一次就可以跑通,這將極大增強初學者做項目的信心。
注冊演示
登錄演示
請求圖片文件演示(6M)
請求視頻文件演示(39M)
Webbench對服務器進行壓力測試,在ET非阻塞和LT阻塞模式下均可實現(xiàn)上萬的并發(fā)連接.
ET非阻塞
LT阻塞
并發(fā)連接總數(shù):10500
訪問服務器時間:5s
所有訪問均成功
項目中所涉及的模塊和知識點,我進行了整理,羅列在下面,每個模塊也對前面學習的知識進行了理解和運用。
線程池
涉及線程,鎖機制。使用一個工作隊列完全解除了主線程和工作線程的耦合關系:主線程往工作隊列中插入任務,工作線程通過競爭來取得任務并執(zhí)行它。
HTTP請求與響應
涉及Linux系統(tǒng)編程,網(wǎng)絡編程,TCP和HTTP協(xié)議。根據(jù)狀態(tài)轉(zhuǎn)移,通過主從狀態(tài)機封裝了http連接類。其中,主狀態(tài)機在內(nèi)部調(diào)用從狀態(tài)機,從狀態(tài)機將處理狀態(tài)和數(shù)據(jù)傳給主狀態(tài)機。
注冊登錄
涉及少許網(wǎng)頁html知識。實現(xiàn)用戶名和密碼校驗,另外通過html文件設置action實現(xiàn)跳轉(zhuǎn)。
定時器
涉及Linux系統(tǒng)信號及數(shù)據(jù)結(jié)構(gòu)的使用。由于非活躍連接占用了連接資源,嚴重影響服務器的性能,通過實現(xiàn)一個服務器定時器,處理這種非活躍連接,釋放連接資源。
數(shù)據(jù)庫連接池
涉及MySQL數(shù)據(jù)庫。建立數(shù)據(jù)庫連接池,通過重復使用這些已經(jīng)建立的數(shù)據(jù)庫連接,解決頻繁建立連接的缺點,從而提高系統(tǒng)性能。
同步/異步日志系統(tǒng)
涉及設計模式,自定義阻塞隊列。同步/異步日志系統(tǒng)主要涉及了兩個模塊,一個是日志模塊,一個是阻塞隊列模塊,其中加入阻塞隊列模塊主要是解決異步寫入日志做準備。
壓力測試
閱讀Webbench源碼,對進程加深理解。通過Webbench創(chuàng)建多個進程,每個進程通過HTTP連接訪問服務器,完成壓力測試。
再次強調(diào),代碼大部是書上的,我只是整理成一個較為完善的項目,并加了一些功能,對所有做了一些注釋和講解。
如果對上面的項目模塊原理有疑問,大家優(yōu)先查閱游雙的Linux高性能服務器編程,還有些模糊的話,查看系列講解,目前周更,已更新到08定時器部分。
C++
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。