www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > 程序喵大人
[導(dǎo)讀]在大多數(shù)同學(xué)眼里,C/C是一門非常“難學(xué)”的編程語言,然而一旦學(xué)生,其功無窮。那要如何學(xué)習(xí)呢?C/C這門語言與其他高級語言不同,它是離操作系統(tǒng)較近的語言。所以學(xué)好C/C體系的技術(shù)棧必須結(jié)合操作系統(tǒng)的運(yùn)行機(jī)制來學(xué)習(xí)。展開來說,就是你必須掌握操作系統(tǒng)層面的幾大基礎(chǔ)知識,他們是匯編、編...

在大多數(shù)同學(xué)眼里,C/C 是一門非常“難學(xué)”的編程語言,然而一旦學(xué)生,其功無窮。那要如何學(xué)習(xí)呢?

C/C 這門語言與其他高級語言不同,它是離操作系統(tǒng)較近的語言。所以學(xué)好 C/C 體系的技術(shù)棧必須結(jié)合操作系統(tǒng)的運(yùn)行機(jī)制來學(xué)習(xí)。展開來說,就是你必須掌握操作系統(tǒng)層面的幾大基礎(chǔ)知識,他們是匯編、編譯鏈接與運(yùn)行時體系、狹義的操作系統(tǒng)原理、多線程、網(wǎng)絡(luò)編程。

第一個基礎(chǔ)知識是匯編,我們學(xué)習(xí)匯編不是一定要用匯編來寫代碼,就像我們學(xué)習(xí) C/C 也不一定單純?yōu)榱嗣嬖嚭驼夜ぷ鳌?/p>對于 C/C 的同學(xué)來說,匯編是建議一定要掌握的,只有這樣,你才能在書寫 C 代碼的時候,清楚地知道你的每一行C 代碼背后對應(yīng)著什么樣的機(jī)器指令,if/for/while 等基本程序結(jié)構(gòu)如何實(shí)現(xiàn)的,函數(shù)的返回值如何返回的,為什么整型變量的數(shù)學(xué)運(yùn)算不是原子的,最終你知道如何書寫代碼才能做到效率最高。掌握了匯編,你可以明白,在 C 中,一個棧對象從構(gòu)造到析構(gòu),其整個生命周期里,開發(fā)者的代碼、編譯器和操作系統(tǒng)分別做了什么。掌握了匯編,你可以理解函數(shù)調(diào)用是如何實(shí)現(xiàn)的,你可以理解函數(shù)的幾種調(diào)用方法,為什么printf這樣的函數(shù)其調(diào)用方式不能是 __stdcall,而必須是 __cdecl。掌握了匯編,你就能明白為什么一個類對象增加一個方法不會增加其實(shí)際占的內(nèi)存空間。

第二個基礎(chǔ)知識是編譯、鏈接與運(yùn)行時體系知識。作為一個開發(fā)者,要清楚地知道我們寫的 C/C 程序是如何通過預(yù)處理、編譯與鏈接等步驟最終變成可執(zhí)行的二進(jìn)制文件,操作系統(tǒng)如何識別一個文件為可執(zhí)行文件,一個可執(zhí)行文件包含什么內(nèi)容,執(zhí)行時如何加載到進(jìn)程的地址空間,程序的每一個變量和數(shù)據(jù)位于進(jìn)程地址空間的什么位置,如何引用到。一個進(jìn)程的地址空間有些什么內(nèi)容,各段地址分布著什么內(nèi)容,為什么讀寫空指針或者野指針會有內(nèi)存問題。一個進(jìn)程如何裝在各個 so 或 dll 文件的,這些文件被加載到進(jìn)程地址空間的什么位置,如何被執(zhí)行,數(shù)據(jù)如何被交換。

第三個基礎(chǔ)知識是狹義的操作系統(tǒng)原理。這里加上“狹義”二字是因?yàn)閺膹V義上來講,以上所說的內(nèi)容都是操作系統(tǒng)原理的范疇。狹義的操作系統(tǒng)原理這里包括操作系統(tǒng)如何管理進(jìn)程與線程,虛擬內(nèi)存與物理內(nèi)存之間的對應(yīng)關(guān)系,何為內(nèi)存映射文件,進(jìn)程之間如何通信等等。

第四個基礎(chǔ)知識是多線程知識嚴(yán)格來說,這點(diǎn)已經(jīng)包括在第三點(diǎn)之中了,我之所以將其單獨(dú)列出來,是因?yàn)槎嗑€程編程是我們做應(yīng)用服務(wù)最常用的技術(shù)之一。最近面試過幾個學(xué)歷非常好的同學(xué),對于一個進(jìn)程中如果某個線程因?yàn)閮?nèi)存問題而退出,是否會導(dǎo)致整個進(jìn)程退出的問題答不好,實(shí)在不應(yīng)該。多線程知識其實(shí)不難學(xué),立足于理解與實(shí)踐而不是應(yīng)付面試,可以學(xué)的很好。無論是 Windows 還是 Linux 操作系統(tǒng),操作系統(tǒng)提供的線程同步對象就那么幾種,Windows 常用的有臨界區(qū)(關(guān)鍵端)、Event、互斥體、信號量等,Linux 有互斥體、信號量、讀寫鎖、條件變量,這些知識點(diǎn)學(xué)過則會,不學(xué)則不會。這些線程同步原語花上幾天就能搞得清楚,大多數(shù)同學(xué)不是學(xué)不會,而是不愿意學(xué),但是偏偏喜歡在簡歷上寫上自己熟悉多線程編程。面試的時候,被問到條件變量的虛假喚醒機(jī)制都說不清楚,非要說自己用過條件變量。這是一些同學(xué)犯的很低級的錯誤,如果真用過條件變量,如果不知道虛假喚醒機(jī)制,那一定寫的代碼是不對的。市場上目前沒有任何一本圖書對以上知識形成體系的介紹,當(dāng)然,我的本書填補(bǔ)了這一空缺,你將從本書中獲得從進(jìn)程與線程的關(guān)系,再到常用的線程同步原語的區(qū)別與使用場景,再到線程池以及基于生產(chǎn)者消費(fèi)者模型的消息隊(duì)列,以及對協(xié)程思想介紹的相關(guān)知識。

掌握了常見的多線程同步原語之后,接下來可以找一些帶多線程的項(xiàng)目去學(xué)習(xí)一下,不管是否帶 UI 的都行。我推薦的一種方式是,使用 gdb 或者 Visual Studio 調(diào)試器將你需要學(xué)習(xí)的多線程程序中斷下來,在多線程面板,看看這個進(jìn)程一共有多少個正在運(yùn)行的線程,分析每個線程的作用,然后研究下這些線程在何時何地創(chuàng)建的,為什么需要創(chuàng)建新的線程。嘗試愛過幾個人,面對愛情你會誠實(shí)很多;嘗試研究幾個多線程項(xiàng)目,面對多線程你會熟練許多。

第五個是網(wǎng)絡(luò)編程,直白地說就是 Socket 編程。操作系統(tǒng)層面提供的 API 會在相當(dāng)長的時間內(nèi)保持接口不變,一旦學(xué)成,終生受用。理解和掌握常用的基礎(chǔ) socket API 不僅可以最大化地去定制各種網(wǎng)絡(luò)通信框架,更不用說使用市面上流行的網(wǎng)絡(luò)通信庫了,最重要的是,它會是你排查各種網(wǎng)絡(luò)疑難雜癥堅(jiān)實(shí)的技術(shù)保障。操作系統(tǒng)層面提供的網(wǎng)絡(luò)模型就那么幾種,無論像 Java/Go/Python 等語言如何封裝,作為技術(shù)的源頭,我們有什么理由不去掌握它呢?市面上關(guān)于網(wǎng)絡(luò)編程的書很多,我在書中結(jié)合我這些年的工作經(jīng)驗(yàn)總結(jié)了二十幾個網(wǎng)絡(luò)編程中的重點(diǎn)和難點(diǎn),現(xiàn)在全部交給你。

以上是基于 C 技術(shù)棧來說,并沒有包括算法與數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫等方面的基本功,但是這些額外的也是應(yīng)該需要掌握的。掌握了如上所說的,你就達(dá)到了一個熟練工階段

為了幫助大家學(xué)好 C ,我給大家推薦一本書《C 服務(wù)器開發(fā)精髓》:


我聯(lián)合了 6 個號主,給大家送 12 本此書,每個號主抽獎送 2 本,一共 12 本。各個號主單獨(dú)抽獎,6 個一起參加,中獎幾率更大。

開公眾號回復(fù)『?cpp?參與抽獎開公眾號回復(fù)『?cpp?參與抽獎
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉