在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++在現(xiàn)在的市場(chǎng)上主要使用在什么領(lǐng)域上

Wildesbeast ? 來源:今日頭條 ? 作者:Hu先生Linux后臺(tái)開發(fā) ? 2020-01-20 11:50 ? 次閱讀

我讀研期間學(xué)的 Windows C++ 開發(fā),畢業(yè)第一份工作很挑,非 Windows C/C++ 不做,后來做了幾年 Windows C++ 技術(shù)負(fù)責(zé)人,再后來又轉(zhuǎn)行做 Linux C++,又做了幾年 Linux C++ 主程,再后來做了 Java 開發(fā),如今作為負(fù)責(zé)人,根據(jù)業(yè)務(wù)做技術(shù)選型,需要哪種語言就用哪種語言。但是我最喜歡的還是 Windows C++,C++ 學(xué)好之后真的能對(duì)你的技術(shù)基礎(chǔ)起的非常好的促進(jìn)作用。

分享下我個(gè)人經(jīng)驗(yàn)和感受吧

寫在前面的話

在大多數(shù)開發(fā)或者準(zhǔn)開發(fā)人員的認(rèn)識(shí)中,C/C++ 是一門非常難的編程語言,很多人知道它的強(qiáng)大,但因?yàn)檎J(rèn)為“難”造成的恐懼讓很多人放棄。

我從學(xué)生時(shí)代開始接觸 C/C++,工作以后先后擔(dān)任過 C++ 客戶端和服務(wù)器的開發(fā)經(jīng)理并帶隊(duì)開發(fā),至今已經(jīng)有十多年了。雖然時(shí)至今日哪種編程語言對(duì)我來說已經(jīng)不再重要(我目前主要從事 Java 開發(fā)),雖然時(shí)至今日哪種編程語言對(duì)我來說已經(jīng)不再重要(我目前主要從事 Java 開發(fā)),其妙無窮,就像武俠小說中的“九陽神功”一樣,有了這個(gè)基礎(chǔ),您可以快速學(xué)習(xí)任何語言和編程技術(shù)。

目前 C/C++ 的應(yīng)用領(lǐng)域

需要注意的是本文不細(xì)分 C 與 C++ 的區(qū)別,通常情況下,C++ 可以看成是 C 的一個(gè)超集,在古典時(shí)期,可以認(rèn)為 C++ 就是 C with classes。雖然如今的 C++從功能層面上來看,離 C 越來越遠(yuǎn)了;但是從語法層面來上來看,大多數(shù) C++ 語法還是與 C 基本一致的,所謂 C++ 的面向?qū)ο筇匦裕绻?xì)究 C++ 類方法的具體語法還是 C 的過程式語法。當(dāng)然,面向?qū)ο笫且环N思想,語言本身對(duì)其支持的程度固然重要,能否熟練地使用則是更要看開發(fā)者的水平了。

C 語言目前主要用于像操作系統(tǒng)這樣一類偏底層的的應(yīng)用開發(fā),包括像 Windows/linux等這樣的大型商業(yè)操作系統(tǒng),和嵌入式操作系統(tǒng)、嵌入式設(shè)備上的應(yīng)用。還有一些開源的軟件,也會(huì)選擇C開發(fā),這些系統(tǒng)主要優(yōu)先考慮程序執(zhí)行效率和生成的可執(zhí)行文件的體積(C 代碼生成的可執(zhí)行文件體積相對(duì)更小),當(dāng)然還有一些是歷史技術(shù)選型問題,這類軟件以 redis、libevent、nginx,目前像國(guó)內(nèi)的電信服務(wù)商所使用的電話呼叫系統(tǒng)一般也是基于一款叫 freeswitch 的開源 C 程序做的二次開發(fā)。

C++ 面向?qū)ο蟮恼Z法與 C 相比較起來,在將高級(jí)語言翻譯成機(jī)器二進(jìn)制碼的時(shí)候 C++ 編譯器在背后偷偷地做了大量工作,生成了大量的額外的機(jī)器碼,而這種機(jī)器碼相對(duì)于 C 來說是不是必須的。例如,對(duì)于一個(gè) C++ 類的實(shí)例方法,編譯器在生成這個(gè)方法的機(jī)器碼時(shí),會(huì)將函數(shù)的第一個(gè)參數(shù)設(shè)置成對(duì)象的 this 指針地址,以此來實(shí)現(xiàn)對(duì)象與函數(shù)的綁定。正因?yàn)槿绱耍S多開發(fā)者會(huì)優(yōu)化和調(diào)整編譯器生成的匯編代碼。

C++ 與操作系統(tǒng)平臺(tái)

從上面的介紹可以看出,與 Java、python 等語言相比,C/C++ 語言是運(yùn)行在離操作系統(tǒng)最近的一種高級(jí)語言,因此其執(zhí)行效率也比較高,但是有得必有失,也因?yàn)槿绱耍?C/C++ 這門語言存在如下特點(diǎn):

C/C++ 整套的語法不具備“功能完備性”,單純地使用這門語言本身提供的功能您無法創(chuàng)建任何有意義的程序,您必須借助操作系統(tǒng)的 API 接口函數(shù)來達(dá)到相應(yīng)的功能。當(dāng)然,隨著 C++ 語言標(biāo)準(zhǔn)和版本的不斷更新升級(jí),這種現(xiàn)狀正在改變;而像 Java、python 這類語言,其自帶的 sdk 提供了各種操作系統(tǒng)的功能。舉個(gè)例子,C/C++ 語言本身是不具備網(wǎng)絡(luò)通信功能的,必須使用操作系統(tǒng)提供的網(wǎng)絡(luò)通信函數(shù)(如socket系本身是不具備網(wǎng)絡(luò)通信功能的,必須使用操作系統(tǒng)提供的網(wǎng)絡(luò)通信函數(shù)(如socket系整的網(wǎng)絡(luò)通信功能。我在讀書的時(shí)候常常聽人說,QQ、360 安全衛(wèi)士這類軟件是用 C/C++ 開發(fā)的,但是當(dāng)我學(xué)完整本 C/C++ 教材以后,仍然寫不出來一個(gè)像樣的窗口程序。許多過來人應(yīng)該都有類似的困惑吧?其原因是一般 C/C++ 的教材不會(huì)教你如何使用操作系統(tǒng) API 函數(shù)的內(nèi)容。

正因?yàn)?C/C++ 語言需要直接使用了操作系統(tǒng)的接口功能,這就造成了 C/C++ 語言繁、難的地方,如操作內(nèi)存方面不當(dāng)容易引起程序宕機(jī),不同的操作系統(tǒng)的 API接口使用習(xí)慣和風(fēng)格也不一樣,接口函數(shù)種類繁多,開發(fā)者如果想開發(fā)跨平臺(tái)的程序,必須要學(xué)習(xí)多個(gè)平臺(tái)的接口函數(shù)和對(duì)應(yīng)的系統(tǒng)原理。

在應(yīng)用層開發(fā),直接使用操作系統(tǒng)的接口的函數(shù),往往執(zhí)行效率高,控制力度大,您的開發(fā)能力僅僅限制于操作系統(tǒng)本身,Java 這類語言,很多功能即使操作系統(tǒng)提供的,如果 Java 虛擬機(jī)不提供,開發(fā)人員也無法使用。正如著名的編程大師 Charles Petzold 說的:

“顯而易見,究竟用哪種方式編寫應(yīng)用程序最好,其實(shí)并無一定之規(guī)。應(yīng)用程序本身的特性應(yīng)該是決定采用何種編程工具的最主要因素,但是無論將來你采用什么樣的編程工具,通過了解操作系統(tǒng) API 從而深入理解操作系統(tǒng)的工作原理,這本身就有很重要的意義。操作系統(tǒng)是一個(gè)非常復(fù)雜的系統(tǒng),在 API 之上加一層編程語言并不能消除其復(fù)雜性,最多不過是把復(fù)雜性隱藏起來而已。說不定什么時(shí)候,這種復(fù)雜的那一面遲早會(huì)蹦出來拖你的后腿,懂得系統(tǒng) API 能讓你到時(shí)候更快地掙脫困境。 在基本操作系統(tǒng)API之上的任何軟件層或多或少都會(huì)限制你使用操作系統(tǒng)的全部功能。比如,你或許發(fā)現(xiàn)采用 Visual Basic 來編寫你的應(yīng)用程序非常理想,但是就有那么一兩項(xiàng)非常基本的功能 Visual Basic 無法支持。往往這個(gè)時(shí)候你得非要調(diào)用基本 API 。作為直接使用操作系統(tǒng) API 的程序員,我們的活動(dòng)空間完全由 API 來規(guī)范,再?zèng)]有什么其他方式比直接調(diào)用 API 更有效、更靈活多樣了。”

總結(jié)起來,C/C++ 語言的開發(fā)核心是建立在直接調(diào)用操作系統(tǒng) API 的基礎(chǔ)上的,優(yōu)點(diǎn)是執(zhí)行效率高、發(fā)揮空間大;缺點(diǎn)是,需要經(jīng)過系統(tǒng)深入的學(xué)習(xí),學(xué)習(xí)周期長(zhǎng),編寫代碼較復(fù)雜、容易出錯(cuò)。

Linux C++ 與 Windows C++ 領(lǐng)域之爭(zhēng)

我之所以把這一個(gè)標(biāo)題單獨(dú)列出來,是想糾正現(xiàn)在很多 C/C++ 新人和初學(xué)者的一些的不當(dāng)認(rèn)識(shí),一般有以下幾種觀點(diǎn):

1.Linux C++ 開發(fā)就是后臺(tái)開發(fā),而 Windows C++ 開發(fā)就是客戶端開發(fā);

2.后端開發(fā)比客戶端開發(fā)(前端)高級(jí),因此后端開發(fā)行業(yè)薪資水平比客戶端開發(fā)薪資要高;

3.我只學(xué) Linux,不學(xué) Windows。

我相信對(duì)于 80 和 90 這一代的開發(fā)者來說,當(dāng)初接觸計(jì)算機(jī)并進(jìn)入軟件行業(yè),都是從接觸 Windows 開始的。時(shí)至今日,大數(shù)據(jù)、人工智能等各種新技術(shù)方興未艾,移動(dòng)互聯(lián)網(wǎng)如火如荼。但是無論是 Linux 還是 Windows,尤其是 Windows,還是我們大多數(shù)人工作、學(xué)習(xí)、娛樂使用最多的操作系統(tǒng),我們每天都會(huì)使用上運(yùn)行在其上的各種軟件。我們使用這些軟件像喝水、呼吸空氣一樣自然,所以很多人就忽視了這類軟件的“基礎(chǔ)作用”。對(duì)于 Windows 上的軟件開發(fā)由于其發(fā)展了很多年了,這些領(lǐng)域也比較成熟,一般不再招初中級(jí)開發(fā),而是需要水平較高、經(jīng)驗(yàn)較豐富的高級(jí)開發(fā)者,這讓很多人造成了“Windows C++”開發(fā)市場(chǎng)需求已經(jīng)很小了的錯(cuò)覺。試問,PC QQ 部門這些年對(duì)外招了多少人?

另外,Linux C++ 和 Windows C++ 一樣,沒有孰高孰低之分,只是兩種不同的操作系統(tǒng)而已,不要覺得在 Linux 下敲命令就比在 Windows 的圖形化界面點(diǎn)擊鼠標(biāo)達(dá)高級(jí)。圖形化界面之于命令行,是人們對(duì)更高級(jí)、更方便的工具的追求的必然結(jié)果。Linux C++ 也不一定就是后臺(tái)開發(fā),Windows C++ 也不一定就是客戶端開發(fā);所謂的服務(wù)器與客戶端是個(gè)相對(duì)的概念,即誰給誰提供服務(wù),提供服務(wù)的我們認(rèn)為是服務(wù)端(后臺(tái)),被服務(wù)的我們認(rèn)為是客戶端(前臺(tái))。而 Windows 作為后臺(tái)服務(wù)的應(yīng)用也比比皆是,如筆者之前所在的某交易所的服務(wù)器后臺(tái)都是 Windows 下的 C++ 程序;另外如一些游戲類的服務(wù)器端,也不少是 Windows 的。

借用《UNIX 編程藝術(shù)》這本書的觀點(diǎn),Windows 和 Linux 的哲學(xué)理念不一樣,Windows 是假設(shè)你不會(huì)操作,它教你如何操作,而 Linux 是假設(shè)你會(huì)操作然后進(jìn)行操作;根據(jù)這個(gè)理念,Windows 一般普通人用的多,而 Linux 程序員用的多。從編程的角度來說,Windows 的代碼風(fēng)格是使用所謂的匈牙利命名法,而 Linux 使用的短小精悍的連字符風(fēng)格,例如同一個(gè)表示屏幕尺寸的整型變量,Windows 上可能被命名為 iScreen 或 cxScreen ,而 Linux 可能是 scrn;再例如 Windows 上創(chuàng)建線程的函數(shù)叫 CreateThread, ,Linux 下叫 pthread_create。有時(shí)候,我覺得 Windows 的,匈牙利命名法反而更容易理解代碼。

這里既然提到前端(客戶端)開發(fā)和后端開發(fā),這里不得不提一下,這二者沒有優(yōu)劣之分。其側(cè)重點(diǎn)和開發(fā)思維是不一樣的,前端(客戶端)開發(fā)一般有較多的界面邏輯,它們是直接與用戶打交道的,因而一款客戶端軟件的好壞很大程度上取決于其界面的易用性和流暢性,開發(fā)者只要把這一端的“一畝三分地”給管理好即可;而后端服務(wù),對(duì)于普通用戶是透明的,開發(fā)者的程序必須盡量體現(xiàn)“服務(wù)”這個(gè)字眼,即更有效地為更多的客戶端服務(wù),這就要求兼顧請(qǐng)求響應(yīng)的正確性、及時(shí)性和流暢性,由于服務(wù)軟件也是運(yùn)行在某臺(tái)物理機(jī)器上的程序,鑒于 CPU、內(nèi)存、網(wǎng)絡(luò)帶寬資源有限,而服務(wù)程序一般是長(zhǎng)周期運(yùn)行的,因此必須合理的分配和使用資源(如盡量回收不再使用的各種資源),開發(fā)者應(yīng)從全局考慮,不能在某個(gè)“客戶端”這一棵樹上“吊死”。

從個(gè)人的職業(yè)發(fā)展來看,建議從事客戶端開發(fā)的讀者適當(dāng)?shù)亓私庖幌路?wù)器開發(fā)的思路,反過來也建議從事后端開發(fā)去學(xué)習(xí)一下客戶端開發(fā),二者相得益彰。從個(gè)人的技術(shù)提高來說,也是很有幫助的。例如您要學(xué)習(xí)一套開源的軟件代碼,如果您熟悉客戶端和服務(wù)器的基本開發(fā)和調(diào)試技巧,您可以更好地學(xué)習(xí)它。而在工作上,一個(gè)項(xiàng)目,往往是由客戶端和服務(wù)器程序組成,如果您都熟悉,您可以站在一個(gè)更高的角度去審視它、規(guī)劃它,這也是架構(gòu)師的基本要求之一。

最后就是很多讀者關(guān)心的客戶端和服務(wù)器的薪資問題,這個(gè)沒有絕對(duì)的誰高誰低,因人而異,因能力而異,因崗位而異。

如何看待 C++ 11/14/17 新標(biāo)準(zhǔn)

C++ 開發(fā)者有個(gè)不成文的規(guī)定就是,即使您對(duì) C++ 很熟悉,也不要在簡(jiǎn)歷上寫上您精通 C++,原因很簡(jiǎn)單—— C++ 這門語言包含的東西實(shí)在太多了,沒有人能真正“精通”所有。C++ 既支持面向?qū)ο笤O(shè)計(jì)(OOP),也支持以模板語法為代表的泛型編程(GP)。而且新的 C++ 標(biāo)準(zhǔn)和遵循 C++ 新標(biāo)準(zhǔn)的編譯器也參出不窮,這些年,C++ 變化越來越大,越來越快,從最初業(yè)界和開發(fā)者翹首以盼的 C++11 標(biāo)準(zhǔn),歷經(jīng) C++14、C++17 到今天的 C++20,這門語言與之前的版本差別越來越大,更多原來需要使用第三庫(kù)的功能也被陸續(xù)添加到 C++ 標(biāo)準(zhǔn)庫(kù)中。以致于C++之父 Bjarne Stroustrup 也開始對(duì)這門語言表示擔(dān)憂:

在 C++11 開始的基礎(chǔ)建設(shè)尚未完成,而 C++17 基本沒有在使基礎(chǔ)更加穩(wěn)固、規(guī)范和完整方面做出改善。相反,卻增加了重要接口的復(fù)雜度(原文為 surface complexity,直譯“表面復(fù)雜度”),讓人們需要學(xué)習(xí)的特性數(shù)量越來越多。C++ 可能在這種不成熟的提議的重壓之下崩潰。我們不應(yīng)該花費(fèi)大量的時(shí)間為專家級(jí)用戶們(比如我們自己)去創(chuàng)建越來越復(fù)雜的東西。(還要考慮普通用戶的學(xué)習(xí)曲線,越復(fù)雜的東西越不易普及。)

當(dāng)然,我們不用有這種擔(dān)憂,畢竟我們既不是 C++ 標(biāo)準(zhǔn)委員會(huì)成員,也不是 C++ 編譯器開發(fā)廠商。就我個(gè)人經(jīng)驗(yàn)來說,對(duì)于 C++11、C++14、C++17 乃至 C++20,我們學(xué)習(xí)它們的準(zhǔn)則應(yīng)該是以實(shí)用為主,也就是說我們應(yīng)該學(xué)習(xí)其實(shí)用的部分,至于新標(biāo)準(zhǔn)提到的一些高級(jí)特性和各種復(fù)雜的模板,我們大可不必去了解。我們并不是做學(xué)術(shù)研究,我們學(xué)習(xí) C++ 是為了投入實(shí)際的生產(chǎn)開發(fā),所以應(yīng)該去學(xué)習(xí) C++ 新標(biāo)準(zhǔn)中實(shí)用的語法和工具庫(kù)。關(guān)于C++11常用一些知識(shí)點(diǎn),這里也簡(jiǎn)單地給讀者列舉一下:

auto 關(guān)鍵字、for-each 循環(huán)、右值及移動(dòng)構(gòu)造函數(shù) + std::forward + std::move + stl 容器新增的 emplace_back() 方法、std::thread 庫(kù)、std::chrono 庫(kù)、智能指針系列(std::shared_ptr/std::unique_ptr/std::weak_ptr)(智能指針的實(shí)現(xiàn)原理一定要知道,最好是自己實(shí)現(xiàn)過)、線程庫(kù) std::thread + 線程同步技術(shù)庫(kù)

std::mutex/std::condition_variable/std::lock_guard 等、lamda 表達(dá)式(JAVA 中現(xiàn)在也常常考察 lamda 表達(dá)式的作用)、std::bind/std::function 庫(kù)、其他的就是一些關(guān)鍵字的用法(override、final、delete),還有就是一些細(xì)節(jié)如可以像 JAVA 一樣在類成員變量定義處給出初始化值。

C++語言基礎(chǔ)與進(jìn)階

基礎(chǔ)

這里說的基礎(chǔ)不是狹義上的 C++ 語言基礎(chǔ),而是包括 C++ 開發(fā)這一生態(tài)體系的基礎(chǔ),筆者認(rèn)為的基礎(chǔ)有:

1.C++ 語言本身熟練使用程度

2.前面也介紹了單純的 C++ 您啥也干不了,您必須結(jié)合一個(gè)具體的操作系統(tǒng)平臺(tái),所以您得熟悉某個(gè)操作系統(tǒng)平臺(tái)的 API 函數(shù),比如 Linux,以及該操作系統(tǒng)的原理。這里說的操作系統(tǒng)的原理不局限于您在操作系統(tǒng)原理圖書上看的知識(shí),而是實(shí)實(shí)在在與系統(tǒng) API 關(guān)聯(lián)起來的,如熟練使用各種進(jìn)程與線程函數(shù)、多線程資源同步函數(shù)、文件操作函數(shù)、系統(tǒng)時(shí)間函數(shù)、窗口自繪與操作函數(shù)(這點(diǎn)針對(duì) Windows)、內(nèi)存分配與管理函數(shù)、PE 或 ELF 文件的編譯、鏈接原理等等。

3.網(wǎng)絡(luò)通信,網(wǎng)絡(luò)通信在這里具體一點(diǎn)就是 socket 編程。這里的 socket 編程不僅要求熟練使用各種網(wǎng)絡(luò) API 函數(shù),還要求理解和靈活運(yùn)用像三次握手四次揮手等各種基礎(chǔ)網(wǎng)絡(luò)通信協(xié)議與原理。關(guān)于 socket 編程實(shí)踐,《TCP/IP網(wǎng)絡(luò)編程》這本書是非常好的入門教材。

說了這么多,您可能會(huì)覺得很抽象。筆者在這里舉個(gè)具體例子,假設(shè)我們現(xiàn)在要開發(fā)一個(gè)類似電驢這樣的軟件。軟件界面如下圖:

如上圖所示,假設(shè)我們的操作系統(tǒng)選擇 Windows,使用語言我們使用 C++,這就要求您必須熟悉 C++ 常用的語法,如果您還不熟悉,您就需要補(bǔ)充這方面的知識(shí)。

在熟悉 C++語法的前提下,從這款產(chǎn)品實(shí)現(xiàn)技術(shù)來看,我們的目標(biāo)產(chǎn)品分為 UI 和網(wǎng)絡(luò)通信部分。下面將詳細(xì)介紹這兩部分:

UI 部分

對(duì)于 UI 部分,我們的認(rèn)識(shí)是這需要使用 Windows 的窗口技術(shù)。我們可以直接使用原生的 Win 32 API 來制作自己的界面庫(kù),也可以選擇一些我們熟悉的界面框架,如 mfc,wtl、duilib、wxWidgets 等。無論您是在閱讀別人的這樣的項(xiàng)目還是需要自己開發(fā)這樣的項(xiàng)目,在確定了這款軟件使用的 UI 庫(kù)(或者使用原生 Win 32 API),您就需要對(duì) Windows 的窗口、對(duì)話框、消息產(chǎn)生、派發(fā)與處理機(jī)制需要了解,同樣的道理,如果不熟悉您需要補(bǔ)充相關(guān)的知識(shí)(關(guān)于這一點(diǎn),下文不再贅述)。

接著,根據(jù)上圖中的軟件功能,大致分為三大模塊,即資源、下載和分享。這三大塊是可以使用一個(gè) Windows Tab 控件去組織,這個(gè)時(shí)候您需要了解 Windows Tab 控件的特性。

1.對(duì)于資源模塊,本質(zhì)上是一個(gè)窗口中嵌入了一個(gè)瀏覽器控件(WebBrowser 控件),那么您需要了解這一個(gè)功能點(diǎn)的相關(guān)知識(shí)。當(dāng)用戶點(diǎn)擊了某個(gè)列表中某個(gè)具體的資源,可以對(duì)齊進(jìn)行下載。這就又涉及到 WebBrowser 控件與 C++ 宿主程序的交互了,那么如何實(shí)現(xiàn)呢?可以選擇使用 ActiveX 技術(shù),也可以使用 javascript 與 C++交互技術(shù)。

2.再來看下載模塊,當(dāng)產(chǎn)生一個(gè)下載操作時(shí),界面上會(huì)產(chǎn)生以下下載列表,每個(gè)列表項(xiàng)會(huì)實(shí)時(shí)顯示下載進(jìn)度、下載速率等參數(shù),同時(shí)正在下載的項(xiàng)目也可以被暫停、停止和刪除。那么這又設(shè)計(jì)到 ListView 控件的相關(guān)功能,以及 ListView 如何與后臺(tái)網(wǎng)絡(luò)通信邏輯交互。

3.分享模塊是將本地資源分享到服務(wù)器或者給其他用戶。界面左側(cè)是對(duì)文件系統(tǒng)的一個(gè)快照,那么這又涉及到如何遍歷文件系統(tǒng)(了解枚舉文件系統(tǒng)的 API),右側(cè)也是一個(gè) ListView 控件,這里不再贅述。

網(wǎng)絡(luò)通信部分

網(wǎng)絡(luò)通信部分,主要有兩大塊,第一個(gè)是程序啟動(dòng)時(shí),與服務(wù)端的交互;第二個(gè)就是文件下載與分享的 P2P 網(wǎng)絡(luò)。您在閱讀或開發(fā)的過程中,如果對(duì)這些技術(shù)比較陌生,您需要補(bǔ)充這些知識(shí),具體的也就是 socket 的各種 API 函數(shù),以及基于這些 API 邏輯的組合。當(dāng)然可能也會(huì)用到操作系統(tǒng)平臺(tái)所特有的網(wǎng)絡(luò) API 函數(shù),如 WSAAsyncSelect 網(wǎng)絡(luò)模型。

再一點(diǎn),網(wǎng)絡(luò)通信部分如何與 UI 部分進(jìn)行數(shù)據(jù)交換,是使用隊(duì)列?全局變量?或者相應(yīng)的 Windows 操作平臺(tái)提供的特殊通信技術(shù),如 PostMessage 函數(shù)、管道?如果使用隊(duì)列,多線程之間如何保持資源的一致性和解決資源競(jìng)態(tài),使用 Event、CriticalSection、Mutex、Semaphore 等等?

當(dāng)然,筆者這里只列舉了這個(gè)軟件的主干部分,還有許多方方面面的細(xì)節(jié)需要考慮。這就需要讀者根據(jù)自己的情況,斟酌和篩選了。您想達(dá)到什么目的,您就去學(xué)習(xí)和研究相關(guān)的代碼。

總結(jié)起來,可以得到如下公式:

一款C++軟件 = C++語法 + 操作系統(tǒng)API函數(shù)調(diào)用

進(jìn)階

如果您達(dá)到了我上面說的三點(diǎn)后,可以再找一些高質(zhì)量的開源的項(xiàng)目去實(shí)戰(zhàn)一下。需要注意的是最好找一些沒有復(fù)雜業(yè)務(wù)或者您熟悉其業(yè)務(wù)的開源項(xiàng)目(如開源的 IM 系統(tǒng)),如果你不熟悉其業(yè)務(wù),不僅要學(xué)習(xí)其業(yè)務(wù)(軟件功能),還需要再去學(xué)習(xí)它的源碼,最后可能讓我們迷失了最初學(xué)習(xí)這款軟件的目的。

學(xué)習(xí)這些項(xiàng)目的同時(shí),讀者應(yīng)該先確定自己的學(xué)習(xí)目的,如果您的目的是學(xué)習(xí)和借鑒這款軟件的架構(gòu),那么先從整體去把握,不要一開始就迷失在細(xì)枝末節(jié)中,這類我稱之為“粗讀”;或者,您的目的是學(xué)習(xí)下開源軟件的在一些細(xì)節(jié)上的處理與做法,這個(gè)時(shí)候,您可以針對(duì)性地去閱讀您感興趣的模塊,深入到每一行代碼上去。

學(xué)習(xí)開源軟件存在一種風(fēng)氣,許多新手喜歡道聽途說,一聽別人說這個(gè)軟件不好,那個(gè)軟件存在某某瑕疵就放棄閱讀它的打算了。然后到了實(shí)際開發(fā)中,因?yàn)樾闹袥]有任何已有軟件開發(fā)問題的解決方案,產(chǎn)生挫敗感,久而久之就對(duì)本來喜歡的 C/C++ 開發(fā)失去了興趣。學(xué)習(xí)的過程是先接觸,再熟悉,再模仿,再創(chuàng)造。不管什么開源項(xiàng)目,在您心中沒有任何思路或者解決方案時(shí),您應(yīng)該先接觸熟悉,不斷模仿,做到至少心中有一套對(duì)于某場(chǎng)景的解決方案,然后再來談創(chuàng)新談批判、改造別人的項(xiàng)目。

我個(gè)人學(xué)習(xí)一套陌生的開源項(xiàng)目時(shí),總是喜歡將程序用調(diào)試器正常跑起來,然后再中斷下來,統(tǒng)計(jì)當(dāng)前的線程數(shù)目,然后通過程序入口 main 函數(shù)從主線程追蹤其他工作線程是如何創(chuàng)建的;接著,分析和研究每個(gè)線程的用途以及線程之間交互的,這就是整體把握,接著找我感興趣的細(xì)節(jié)去學(xué)習(xí)。

這里我以學(xué)習(xí) redis 為例,將 redis 源碼從官網(wǎng)下載下來以后,使用您喜歡的代碼閱讀器管理起來,我這里使用的是 Visual Studio,如下圖所示:

在大致了解了 redis 有哪些代碼模塊以后,我們把代碼拷貝到 linux 平臺(tái),然后編譯并使用 gdb 調(diào)試器跑起來。如下圖所示:

然后使用按 ctrl + C 將gdb中斷下來,輸入info threads查看當(dāng)前程序的所有線程:

接著挨個(gè)使用 thread + 線程編號(hào) 和 bt 命令去查看每個(gè)線程的上下文調(diào)用堆棧:

然后對(duì)照每個(gè)線程的上下文堆棧,搞清楚其邏輯,并結(jié)合主線程,看看每個(gè)線程是在何時(shí)啟動(dòng)、端口在何時(shí)啟動(dòng)偵聽的等等。等做完這一步,關(guān)于 redis-server 的框架也基本清楚了。

端口在何時(shí)啟動(dòng)偵聽的等等。等做完這一步,關(guān)于 redis-server 的框架也基本清楚了。

最后,如果對(duì) redis-server 源碼中各種數(shù)據(jù)結(jié)構(gòu)和細(xì)節(jié)感興趣,我們可以進(jìn)一步深入到具體的代碼細(xì)節(jié)。

當(dāng)然,不熟悉 gdb 的讀者看筆者這段操作流程比較困難,這是正常的,說明如果想通過調(diào)試去研究 redis 這一款開源軟件,您需要去補(bǔ)充一點(diǎn) gdb 調(diào)試的知識(shí)。這就是我上文中所說的,針對(duì)性地補(bǔ)缺補(bǔ)差。

小結(jié)

關(guān)于 C/C++,暫且就討論這么多。最后再?gòu)?qiáng)調(diào)一遍,C++ 是一門講究深度的語言,其“深度”不是體現(xiàn)在會(huì)多少 C++ 語法,而是能夠洞察您所寫的 C++ 代碼背后的系統(tǒng)原理,這是需要長(zhǎng)期不斷的積累的,沒有速成之法。反過來一旦學(xué)成,可以快速地學(xué)習(xí)其他語言和框架。個(gè)人覺得,如果自主創(chuàng)業(yè)或者想在二三線城市長(zhǎng)期發(fā)展的讀者,C/C++ 應(yīng)該是優(yōu)選語言,有了它作為基礎(chǔ),您可以跳出依賴各種環(huán)境和框架的窠臼,快速地學(xué)習(xí)和開發(fā)您想要的軟件,完成您想要的業(yè)務(wù)產(chǎn)品。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3598

    瀏覽量

    90684
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7628

    瀏覽量

    139639
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2116

    瀏覽量

    74552
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    市場(chǎng)上主流的端側(cè)AI MPU 大全

    當(dāng)前市場(chǎng)上主流的端側(cè)AI MPU(Micro Processing Unit,微處理器)品牌及型號(hào)盤點(diǎn),涵蓋不同應(yīng)用場(chǎng)景(如物聯(lián)網(wǎng)、邊緣計(jì)算、嵌入式設(shè)備等)的芯片選擇: ? 1. 國(guó)際品牌
    的頭像 發(fā)表于 04-02 17:44 ?1289次閱讀

    rtsmart開啟C++特性支持后,工具鏈編譯內(nèi)核不通過怎么解決?

    各位大佬好,本人在rtsmart項(xiàng)目中需要使C++11特性,menuconfig那里配置了支持C++特性后,使用7.3.0版本的arm-linux-musleabi編譯器編譯內(nèi)核時(shí)
    發(fā)表于 03-10 08:06

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序中。Spire.XLS for C+
    的頭像 發(fā)表于 01-14 09:40 ?455次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    Norflash閃存芯片HT25Q20D廣泛應(yīng)用在汽車電子領(lǐng)域

    全球NOR Flash市場(chǎng)由四家主要制造商主導(dǎo),除巨頭之外,還有華芯邦等廠商市場(chǎng)上也占有一席之地,主要為藍(lán)牙、音頻、WIFI等SoC主控芯
    的頭像 發(fā)表于 01-13 15:20 ?717次閱讀
    Norflash閃存芯片HT25Q20D廣泛應(yīng)<b class='flag-5'>用在</b>汽車電子<b class='flag-5'>領(lǐng)域</b>

    同樣是函數(shù),CC++中有什么區(qū)別

    同樣是函數(shù), CC++ 中有什么區(qū)別? 第一個(gè)返回值。 C語言的函數(shù)可以不寫返回值類型,編譯器會(huì)默認(rèn)為返回 int。 但是 C++
    的頭像 發(fā)表于 11-29 10:25 ?710次閱讀

    藍(lán)鵬測(cè)控 緊加緊 多渠道多手段保測(cè)量市場(chǎng)

    “藍(lán)鵬測(cè)控緊加緊,多渠道多手段保測(cè)量市場(chǎng)”這句話可能是描述藍(lán)鵬測(cè)控這家公司測(cè)量市場(chǎng)領(lǐng)域的競(jìng)
    發(fā)表于 11-18 14:53

    C7000優(yōu)化C/C++編譯器

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費(fèi)下載
    發(fā)表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    國(guó)產(chǎn)MCU有推薦嗎?最好是經(jīng)過市場(chǎng)驗(yàn)證的!

    市場(chǎng)上得到了廣泛的應(yīng)用和驗(yàn)證。英銳恩科技小篇將推薦幾款經(jīng)過市場(chǎng)驗(yàn)證的國(guó)產(chǎn)MCU,幫助開發(fā)者選擇時(shí)更加從容。 隨著國(guó)家對(duì)半導(dǎo)體產(chǎn)業(yè)的重視和支持,國(guó)產(chǎn)MCU的發(fā)展迎來了新的機(jī)遇。近年來,多家國(guó)內(nèi)企業(yè)
    發(fā)表于 09-26 16:38

    ostreamc++中的用法

    ostream 是 C++ 標(biāo)準(zhǔn)庫(kù)中一個(gè)非常重要的類,它位于 頭文件中(實(shí)際,更常見的是通過包含 頭文件來間接包含 ,因?yàn)?包含了 和 )。 ostream 類及其派生類(如 std::cout
    的頭像 發(fā)表于 09-20 15:11 ?1481次閱讀

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeQueue

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是dequeue的基礎(chǔ)封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
    的頭像 發(fā)表于 08-30 12:41 ?527次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫(kù)案例:SafeQueue

    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:SafeStack

    1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫(kù)的線程安全隊(duì)列:SafeQueue。線程安全隊(duì)列,是dequeue的基礎(chǔ)封裝std::lock_guard,以此實(shí)現(xiàn)線程的相關(guān)
    的頭像 發(fā)表于 08-30 12:41 ?549次閱讀
    基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的<b class='flag-5'>C++</b>公共基礎(chǔ)類庫(kù)案例:SafeStack

    C++語言基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?8次下載

    C++中實(shí)現(xiàn)類似instanceof的方法

    函數(shù),可實(shí)際C++中沒有。但是別著急,其實(shí)C++中有兩種簡(jiǎn)單的方法可以實(shí)現(xiàn)類似Java中的instanceof的功能。 C++
    的頭像 發(fā)表于 07-18 10:16 ?801次閱讀
    <b class='flag-5'>C++</b>中實(shí)現(xiàn)類似instanceof的方法

    如何在FX3 SuperSpeed explorer等電路板使用openOCD調(diào)試C++項(xiàng)目?

    嘗試調(diào)試一些可用的 C++ 示例(如 BulkLpAutoCpp)后,我發(fā)現(xiàn)任何基于 C++ 的項(xiàng)目 openocd 下都無法正常調(diào)試,反而會(huì)停止。
    發(fā)表于 05-23 08:16

    USound宣布推出市場(chǎng)上首個(gè)單MEMS驅(qū)動(dòng)器音頻解決方案

    據(jù)麥姆斯咨詢報(bào)道,全球領(lǐng)先的MEMS揚(yáng)聲器供應(yīng)商USound宣布推出市場(chǎng)上首個(gè)單MEMS驅(qū)動(dòng)器音頻解決方案
    的頭像 發(fā)表于 05-20 09:06 ?735次閱讀
    主站蜘蛛池模板: 日韩三级| 三级网站在线播放 | 美国三级网 | 久久观看视频 | 天天操狠狠操夜夜操 | 色婷婷综合和线在线 | 青草青草视频2免费观看 | 日本三级网址 | 特黄视频免费看 | 人人看人人玩 | 69日本xxxxxxxxx78 69日本xxxxxxxxx96 | 精品三级国产精品经典三 | 国产一级aa大片毛片 | 97超频国产在线公开免费视频 | 男女免费视频 | 亚洲综合色在线 | 88av免费 | 久精品视频村上里沙 | 六月色播| 天天射天天干天天插 | 国产精品三级在线播放 | 日本免费色 | 色网址在线观看 | 医生好大好硬好爽好紧 | 五月天婷婷导航 | 久爱综合| 亚洲va久久久噜噜噜久久狠狠 | 丁香婷婷激情五月 | 久久久久久久国产精品电影 | 免费一级特黄特色大片 | 色色色色色色色色色色色色 | 我要看一级大片 | 天天爽天天干 | 欧美 变态 另类 人妖班 | 欧美片欧美日韩国产综合片 | 天天射天天干天天操 | 五月婷婷六月合 | 欧美高h | 午夜免费啪 | 在线免费日韩 | 亚洲日本欧美 |