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

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

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

讓C++代碼更加高效的幾個(gè)小技巧

Q4MP_gh_c472c21 ? 來(lái)源:程序喵大人 ? 作者:程序喵大人 ? 2021-09-23 15:20 ? 次閱讀

今天和大家介紹一下能讓C++代碼更加高效的幾個(gè)小技巧,話不多說(shuō),以下為本文目錄:

參數(shù)傳遞方式:值傳遞還是引用傳遞

函數(shù)返回方式:按值返回還是按引用返回

使用移動(dòng)語(yǔ)義

避免創(chuàng)建臨時(shí)對(duì)象

了解返回值優(yōu)化

考慮預(yù)分配內(nèi)存

考慮內(nèi)聯(lián)

迭代 vs 遞歸

選擇高效的算法

利用緩存

profiling

other碎碎念

以下為正文:

值傳遞還是引用傳遞:

一般情況下使用const的引用參數(shù)。對(duì)于函數(shù)本身會(huì)拷貝的參數(shù),最好使用值傳遞,但只有當(dāng)參數(shù)的類型支持移動(dòng)語(yǔ)義時(shí)才這樣。

在某些情況下,值傳遞并移動(dòng)實(shí)際上是向函數(shù)傳遞參數(shù)的最佳方式(注意看后面的tips),例如:

class A { public: A(const std::string &str) { str_ = str; }

private: std::string str_;};

可以考慮改為這種形式:

class A { public: A(std::string str) { str_ = std::move(str); }

private: std::string str_;};

因?yàn)闊o(wú)論如何都會(huì)對(duì)它們進(jìn)行拷貝。

tips:看有些資料說(shuō)后者值傳遞是更好的參數(shù)傳遞方式,貌似有些道理,但是我沒(méi)找到非常合理的理由,有知道的讀者可以在評(píng)論區(qū)留言。

按值返回還是按引用返回:

可以通過(guò)從函數(shù)中按引用方式返回對(duì)象,以避免對(duì)象發(fā)生不必要的復(fù)制。但有時(shí)不可能通過(guò)引用返回對(duì)象,例如編寫重載的operator+和其他類似運(yùn)算符時(shí)。

永遠(yuǎn)都不要返回指向局部對(duì)象的引用或指針,局部對(duì)象會(huì)在函數(shù)退出時(shí)被銷毀。

但是,按值返回對(duì)象通常沒(méi)啥大問(wèn)題。因?yàn)橐话闱闆r下他們會(huì)觸發(fā)返回值優(yōu)化或移動(dòng)語(yǔ)義,即不會(huì)有多余的拷貝動(dòng)作。

使用移動(dòng)語(yǔ)義:

盡量確保對(duì)象擁有移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符。對(duì)象有了移動(dòng)語(yǔ)義后,許多操作都會(huì)更加高效,特別是與標(biāo)準(zhǔn)庫(kù)和算法相結(jié)合時(shí)。

避免創(chuàng)建臨時(shí)對(duì)象:

沒(méi)有必要的臨時(shí)對(duì)象能避免就避免。一般來(lái)說(shuō),應(yīng)該避免迫使編譯器構(gòu)造臨時(shí)對(duì)象的情況。盡管有時(shí)這是不可避免的,但是至少應(yīng)該意識(shí)到這項(xiàng)“特性”的存在,這樣才不會(huì)為實(shí)際性能和分析結(jié)果而感到驚訝。編譯器還會(huì)使用移動(dòng)語(yǔ)義使臨時(shí)對(duì)象的效率更高。這是要在類中添加移動(dòng)語(yǔ)義的另一個(gè)原因。

《More Effective C++》第19條款中介紹過(guò):所謂的臨時(shí)對(duì)象并不是程序員創(chuàng)建的用于存儲(chǔ)臨時(shí)值的對(duì)象,而是指編譯器層面上的臨時(shí)對(duì)象:這種臨時(shí)對(duì)象不是由程序員創(chuàng)建,而是由編譯器為了實(shí)現(xiàn)某些功能(例如函數(shù)返回,類型轉(zhuǎn)換等)而創(chuàng)建。

比如下面的代碼就會(huì)有臨時(shí)對(duì)象的產(chǎn)生:

void Func(const std::string& s);char arr[]=“hello”;Func(aar); // here

返回值優(yōu)化

通過(guò)值返回對(duì)象的函數(shù)可能導(dǎo)致創(chuàng)建一個(gè)臨時(shí)對(duì)象??聪旅娴拇a:

Person createPerson(){ Person newP { “Marc”, “Gregoire”, 42 }; return newP;}

假如像這樣調(diào)用這個(gè)函數(shù)(假設(shè)Person 類已經(jīng)實(shí)現(xiàn)了operator《《運(yùn)算符):

cout 《《 createPerson();

即便這個(gè)調(diào)用沒(méi)有將createPerson()的結(jié)果保存在任何地方,也必須將結(jié)果保存在某個(gè)地方,才能傳遞給operator《《。為此編譯器創(chuàng)建一個(gè)臨時(shí)變量,來(lái)保存createPerson()返回的Person 對(duì)象。

即使這個(gè)函數(shù)的結(jié)果沒(méi)有在任何地方使用,編譯器也仍然可能會(huì)生成創(chuàng)建臨時(shí)對(duì)象的代碼:

createPerson();

編譯器可能生成代碼來(lái)創(chuàng)建一個(gè)臨時(shí)對(duì)象來(lái)保存返回值,即使這個(gè)返回值沒(méi)有使用也是如此。

不過(guò)吧,編譯器會(huì)在大多數(shù)情況下優(yōu)化掉臨時(shí)變量,以避免復(fù)制和移動(dòng)。

關(guān)于返回值優(yōu)化我之前有篇文章介紹過(guò),感興趣的可以看看這個(gè):《左值引用、右值引用、移動(dòng)語(yǔ)義、完美轉(zhuǎn)發(fā),你知道的不知道的都在這里》

預(yù)分配內(nèi)存:

比如標(biāo)準(zhǔn)化容器中的reserve,需要頻繁創(chuàng)建內(nèi)存的地方可以考慮預(yù)分配一塊內(nèi)存出來(lái),避免頻繁的創(chuàng)建內(nèi)存。

內(nèi)聯(lián)函數(shù):

短函數(shù)可以使用內(nèi)聯(lián)消除函數(shù)開(kāi)銷。

迭代 vs 遞歸:

這里我更傾向于選擇迭代方式,而不是遞歸。遞歸占用大量棧內(nèi)存,且可能會(huì)產(chǎn)生很多不必要的臨時(shí)對(duì)象構(gòu)建。

選擇效率更高的算法:

學(xué)計(jì)算機(jī)的估計(jì)沒(méi)有不知道算法的吧,學(xué)算法估計(jì)沒(méi)有人不知道如何計(jì)算時(shí)間復(fù)雜度和空間復(fù)雜度吧,在平時(shí)開(kāi)發(fā)過(guò)程中遇到算法問(wèn)題時(shí)我們可盡量選擇效率更高的算法,比如O(N)和O(N2)的算法,我們肯定要選擇O(N)的呀,這里可以了解下C++的,這里引入了很多高效的算法供我們使用。

盡可能多的使用緩存:

將某些數(shù)據(jù)保存下來(lái)供下次使用,避免再次獲取或重新計(jì)算它們。如果任務(wù)或計(jì)算特別慢,應(yīng)該保證不執(zhí)行那些沒(méi)有必要的任務(wù)或者重復(fù)計(jì)算。

網(wǎng)絡(luò)通信:如果頻繁發(fā)起相同的網(wǎng)絡(luò)請(qǐng)求,可考慮將第一次的網(wǎng)絡(luò)請(qǐng)求結(jié)果保存在內(nèi)存中,或文件中?

磁盤訪問(wèn):如果頻繁訪問(wèn)一個(gè)文件,可考慮將這個(gè)文件的內(nèi)容保存在內(nèi)存中。

數(shù)學(xué)計(jì)算:某些很耗時(shí)很復(fù)雜的運(yùn)算,可考慮只執(zhí)行這種計(jì)算一次,然后共享結(jié)果。

對(duì)象分配:如果需要大量頻繁創(chuàng)建和銷毀短期對(duì)象,可考慮使用對(duì)象池。

線程創(chuàng)建:如果需要大量頻繁創(chuàng)建和銷毀線程,可考慮使用線程池。

做客戶端開(kāi)發(fā)的朋友應(yīng)該都聽(tīng)說(shuō)多級(jí)緩存的概念,就是這個(gè)原理。

profiling:

那到底什么樣的代碼才算是高質(zhì)量代碼呢?

對(duì)此我整理了一份腦圖:

fd689c40-0fc9-11ec-8fb8-12bb97331649.png

如何能夠提升代碼質(zhì)量呢,除了我們自身過(guò)硬的編碼能力,還需要制定代碼檢查流程,一般代碼檢查有以下幾種方式:

fda83e86-0fc9-11ec-8fb8-12bb97331649.png

代碼檢查要檢查的問(wèn)題有:

fdb5be76-0fc9-11ec-8fb8-12bb97331649.png

腦圖中有一些代碼度量指標(biāo),它用于量化代碼質(zhì)量:

如果代碼的圈復(fù)雜度或認(rèn)知復(fù)雜度過(guò)大,可能函數(shù)本身實(shí)現(xiàn)的過(guò)于復(fù)雜,或可能因?yàn)榧軜?gòu)設(shè)計(jì)過(guò)于復(fù)雜,導(dǎo)致函數(shù)過(guò)于復(fù)雜。

如果函數(shù)嵌套過(guò)深,說(shuō)明函數(shù)很可能出錯(cuò),需要仔細(xì)進(jìn)???評(píng)審,并且函數(shù)可能需要重構(gòu)。

如果模塊的扇入過(guò)大,說(shuō)明模塊可能是公共模塊,需要??評(píng)審接?是否是穩(wěn)定的,或模塊承擔(dān)過(guò)多職責(zé),可以考慮遵循單?職責(zé),分解模塊的職責(zé)。

如果模塊的扇出過(guò)大,說(shuō)明該模塊依賴多個(gè)模塊,可以考慮把被依賴的多個(gè)模塊合并為?個(gè)模塊,重構(gòu)依賴的接?。

如果類的繼承樹(shù)過(guò)深,考慮在繼承樹(shù)的深度上是否有新的變化?向,考慮提出新的策略類,或其他設(shè)計(jì)模式來(lái)優(yōu)化繼承樹(shù)。

如果子類過(guò)多,檢查?類的實(shí)現(xiàn)中共同的地?,先考慮提出公共的中間?類,檢查是否可以通過(guò)橋接模式、裝飾模式、組合模式等結(jié)構(gòu)型模式重構(gòu)代碼。

上面腦圖所說(shuō)的需要檢查的各種問(wèn)題中,代碼和需求背離問(wèn)題與代碼是否符合設(shè)計(jì)問(wèn)題需要人工評(píng)審,成本較高,其它問(wèn)題可以通過(guò)工具來(lái)檢測(cè)。

檢測(cè)工具主要分為靜態(tài)代碼分析工具和動(dòng)態(tài)代碼檢測(cè)工具。

靜態(tài)代碼分析工具主要用于靜態(tài)代碼分析,關(guān)于靜態(tài)代碼分析,它能夠根據(jù)規(guī)則幫助檢查代碼缺陷,然而,對(duì)于檢查規(guī)則能夠覆蓋的代碼,工具能夠工作的挺好,但對(duì)于規(guī)則沒(méi)有覆蓋的代碼,它卻無(wú)能為力,而且可能存在誤報(bào)問(wèn)題。

靜態(tài)代碼分析是保證代碼質(zhì)量的重要手段,據(jù)說(shuō)軟件開(kāi)發(fā)中大概30%-70%的代碼邏輯設(shè)計(jì)和編碼缺陷都可以通過(guò)靜態(tài)代碼分析來(lái)發(fā)現(xiàn)和修復(fù)。它會(huì)掃描程序代碼,找出代碼中隱藏的錯(cuò)誤,如參數(shù)不匹配、有歧義的嵌套語(yǔ)句、錯(cuò)誤的遞歸、非法計(jì)算、空指針問(wèn)題、越界問(wèn)題、未初始化問(wèn)題、內(nèi)存泄漏問(wèn)題等。

靜態(tài)代碼分析工具的優(yōu)勢(shì)有:

自動(dòng)執(zhí)行靜態(tài)代碼分析,快速定位代碼隱藏錯(cuò)誤和缺陷

幫助代碼設(shè)計(jì)人員更專注于分析和解決代碼設(shè)計(jì)缺陷

減少在代碼人工檢查上花費(fèi)的時(shí)間,提高軟件可靠性并節(jié)省開(kāi)發(fā)成本

舉例如下:

代碼規(guī)范檢查:由于拷貝粘貼造成兩個(gè)分支的代碼完全相同

void func(int in, int &out) { if (in 》 1) out++; else out++; out++;}

代碼缺陷檢查:沒(méi)有用的RAII

void func() { std::lock_guard《std::mutex》(lk); // 臨時(shí)對(duì)象,語(yǔ)句結(jié)束后執(zhí)行析構(gòu),誤用的加鎖 。..}

下面是一些常見(jiàn)的靜態(tài)代碼分析工具:

fdc5b54c-0fc9-11ec-8fb8-12bb97331649.png

這里推薦一個(gè)常用的代碼質(zhì)量管理平臺(tái)SonarCube,SonarQube是一個(gè)管理代碼質(zhì)量的平臺(tái)(社區(qū)版免費(fèi)),用于管理代碼的質(zhì)量,它會(huì)從多個(gè)角度維護(hù)檢測(cè)代碼質(zhì)量,通過(guò)插件形式支持多種語(yǔ)言的代碼質(zhì)量管理和檢測(cè)。它可以安裝sonar-cxx插件,內(nèi)置了一系列C/C++代碼檢查工具,還可以應(yīng)用在CI/CD流程中,和Jenkins打通,可以在提交代碼后檢查代碼是否有壞味道,不符合規(guī)范的代碼就拒絕被合入master。

還有一個(gè)很好用的靜態(tài)代碼檢測(cè)工具是Facebook的infer,它最大的優(yōu)勢(shì)是可以靜態(tài)檢測(cè)代碼內(nèi)隱藏的內(nèi)存泄漏問(wèn)題,而且免費(fèi)支持Android、C、OC語(yǔ)言。

靜態(tài)代碼分析工具可以在運(yùn)行前幫助我們檢測(cè)缺陷,只有30%-70%,但不是所有缺陷,很多缺陷需要在運(yùn)行時(shí)才會(huì)被發(fā)現(xiàn)。

其實(shí)我們還可以使用一些動(dòng)態(tài)分析工具,通過(guò)動(dòng)態(tài)分析工具可以準(zhǔn)確定位問(wèn)題,而且誤報(bào)率低,但這與測(cè)試用例強(qiáng)綁定,查找缺陷的比例與測(cè)試用例的覆蓋率有關(guān),覆蓋率對(duì)于衡量代碼質(zhì)量有很大意義。

代碼覆蓋率的意義:

● 幫助我們找到未覆蓋部分的代碼,分析測(cè)試用例設(shè)計(jì)的是否充分,之后視情況決定是否可以補(bǔ)充測(cè)試用例。

● 檢測(cè)出代碼的壞味道,提示我們修改代碼,理清代碼邏輯關(guān)系,提升代碼質(zhì)量。

● 代碼覆蓋率高不能代表代碼質(zhì)量一定好,但代碼覆蓋率低,代碼質(zhì)量估計(jì)不會(huì)高到哪去,可以作為我們衡量代碼質(zhì)量的重要手段之一。

● 對(duì)于沒(méi)有覆蓋到的錯(cuò)誤,動(dòng)態(tài)分析工具也無(wú)能為力。在實(shí)際工作中,我們可以動(dòng)靜結(jié)合,多種檢查手段全都用上,可以更有效的提升代碼質(zhì)量。

動(dòng)態(tài)分析工具可以在程序運(yùn)行時(shí)發(fā)現(xiàn)代碼的缺陷,例如內(nèi)存問(wèn)題、數(shù)據(jù)競(jìng)爭(zhēng)、未定義行為等。

常用工具有GCC&Clang的Santizer系列:

● Asan-Address Sanitizer:緩存區(qū)溢出,內(nèi)存泄漏

● Tsan-Thread Sanitizer:并發(fā)問(wèn)題

● Msan-Memory Sanitizer:未初始化內(nèi)存

● Ubsan-Undefined Behavior Sanitizer:未定義行為

● 編譯選項(xiàng)添加fsanitize=address/memory/thread/undefined

還有Valgrind工具:

● memchek:內(nèi)存問(wèn)題,包括Asan和Msan

● helgrind:線程和并發(fā)問(wèn)題

● cachegrind、callgrind、massif:幫助進(jìn)行性能優(yōu)化

使用各種工具與單元測(cè)試、功能測(cè)試、系統(tǒng)測(cè)試結(jié)合,提高覆蓋率,可以幫助我們發(fā)現(xiàn)更多缺陷。

前面的多數(shù)都是代碼分析工具,下面介紹一些性能分析工具,關(guān)于性能分析工具Brendan Gregg大佬的網(wǎng)站介紹的很詳細(xì),這里貼出來(lái)一張他總結(jié)的工具圖:

這張圖從Linux內(nèi)核的各個(gè)子系統(tǒng)出發(fā),匯總了對(duì)各個(gè)子系統(tǒng)進(jìn)行性能分析時(shí)可以選擇的工具。其實(shí)還有一些好用的工具,圖里沒(méi)有提到,這里重點(diǎn)介紹一下:

gprof:gprof是GNU工具之一,編譯的時(shí)候,它在每個(gè)函數(shù)的出入口加入了profiling的代碼,運(yùn)行時(shí)統(tǒng)計(jì)程序在用戶態(tài)的執(zhí)行信息,可以得到每個(gè)函數(shù)的調(diào)用次數(shù),執(zhí)行時(shí)間,調(diào)用關(guān)系等信息,簡(jiǎn)單易懂。適合于查找用戶級(jí)程序的性能瓶頸,然而對(duì)于很多耗時(shí)在內(nèi)核態(tài)執(zhí)行的程序,gprof不適合。

Oprofile:Oprofile也是一個(gè)開(kāi)源的profiling工具,它使用硬件調(diào)試寄存器來(lái)統(tǒng)計(jì)信息,進(jìn)行profiling的開(kāi)銷比較小,而且可以對(duì)內(nèi)核進(jìn)行profiling。它統(tǒng)計(jì)的信息非常多,可以得到cache的缺失率,memory的訪存信息,分支預(yù)測(cè)錯(cuò)誤率等等,這些信息gprof得不到,但是對(duì)于函數(shù)調(diào)用次數(shù),它無(wú)能為力。

簡(jiǎn)單來(lái)說(shuō),gprof簡(jiǎn)單,適合于查找用戶級(jí)程序的瓶頸,而Oprofile稍微有點(diǎn)復(fù)雜,但是得到的信息更多,更適合調(diào)試系統(tǒng)軟件。

gperftools:Google出品,值得信賴,提供整個(gè)程序的熱點(diǎn)分布圖,找到性能瓶頸,然后可以針對(duì)性的進(jìn)行性能優(yōu)化,如圖:

那使用什么API效率更高呢,可以看下圖:

fdf84f66-0fc9-11ec-8fb8-12bb97331649.png

圖中的rdtsc使用較繁瑣而且不適用于所有平臺(tái)和編譯器,剩下的大家可以按需使用哈。

關(guān)于性能分析工具,程序喵整理了一份非常詳細(xì)的腦圖(精華全在腦圖里),以性能指標(biāo)分類,不同指標(biāo)使用什么工具進(jìn)行分析,都在圖里,目錄如下:

other碎碎念:

選擇合適的數(shù)據(jù)結(jié)構(gòu):

選擇合適的STL,想清楚什么時(shí)候用棧,什么時(shí)候用隊(duì)列,什么時(shí)候用數(shù)組,什么時(shí)候用鏈表。

某些if-else可改為switch,效率可能更高(知道為什么嗎,不知道的可以留言,人多的話考慮輸出一篇文章)。

優(yōu)先考慮棧內(nèi)存,而不是堆內(nèi)存(免得頻繁的申請(qǐng)釋放內(nèi)存)。

如何函數(shù)不需要返回值,就不要設(shè)置返回值。

使用位操作,移位代替乘法除法操作。

構(gòu)造函數(shù)時(shí)使用初始化方式,而不是賦值。

A::A() : a_(a) {} // better

A::A() { a_ = a;}

明確使用模板帶來(lái)的益處:

如果使用模板并沒(méi)有給你的開(kāi)發(fā)帶來(lái)任何益處,是不是可以考慮不使用它,因?yàn)檎{(diào)試起來(lái)真的麻煩。

函數(shù)參數(shù)的個(gè)數(shù)不要太多。

擅用emplace,有些情況下會(huì)省去一次構(gòu)造的開(kāi)銷。

最后想說(shuō)一句:

先完成再完美。不要一開(kāi)始就想著寫最完美的代碼,很多bug都是過(guò)早過(guò)度優(yōu)化導(dǎo)致的。一般情況下,性能較高的代碼可讀性都不是特別高。提早優(yōu)化很可能引發(fā)很多bug。很多情況下,我們可以先完成代碼,確保功能完成且正確之后,再去考慮完善。完成代碼后,可以使用profiling工具,找到瓶頸所在,然后做相應(yīng)優(yōu)化。另外產(chǎn)品和測(cè)試如果沒(méi)給你提性能需求,那優(yōu)化它干嘛!

責(zé)任編輯:haq

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

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73404
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4695

    瀏覽量

    68079

原文標(biāo)題:看完這12條,寫出高效代碼

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:掌握常量,你的代碼更加穩(wěn)固高效!

    C語(yǔ)言的世界中,常量是一種不可忽視的元素。無(wú)論你是在編寫簡(jiǎn)單的代碼,還是構(gòu)建復(fù)雜的系統(tǒng),常量都能為你的程序帶來(lái)更高的穩(wěn)定性和可靠性。在這篇文章中,我們將深入探討C語(yǔ)言中的常量,從整數(shù)常量到字符串
    的頭像 發(fā)表于 08-29 13:59 ?2587次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b>語(yǔ)言:掌握常量,<b class='flag-5'>讓</b>你的<b class='flag-5'>代碼</b><b class='flag-5'>更加</b>穩(wěn)固<b class='flag-5'>高效</b>!

    請(qǐng)問(wèn)一下還有比TLV3501更加高速的比較器嗎?

    請(qǐng)問(wèn)一下還有比TLV3501更加高速的比較器嗎,還有,TI有哪些比較高速的比較器推薦
    發(fā)表于 08-23 07:01

    ModusToolbox 3.2在c代碼中包含c++代碼的正確步驟是什么?

    使用 ModusToolbox 3.2 我有一個(gè)用純 C 語(yǔ)言編寫的 XMC4700 項(xiàng)目。 我正在嘗試添加一些 C++ 函數(shù),并將其合并到我的原始代碼中。 我可以構(gòu)建獨(dú)立的 .cpp/.hpp
    發(fā)表于 07-23 08:21

    OpenCV圖像識(shí)別C++代碼

    的頭文件 在您的C++代碼中,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?1409次閱讀

    Perforce靜態(tài)代碼分析專家解讀MISRA C++:2023?新標(biāo)準(zhǔn):如何安全、高效地使用基于范圍的for循環(huán),防范未定義行

    MISRA C++:2023——MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本來(lái)了!為了幫助您了解 MISRA C++:2023相比于之前版本的變化,我們將繼續(xù)為您帶來(lái)Perforce首席技術(shù)支持工程師
    的頭像 發(fā)表于 06-18 12:57 ?295次閱讀

    基于RFID和AI等先進(jìn)技術(shù),醫(yī)療保健更加高效、準(zhǔn)確

    電子發(fā)燒友網(wǎng)報(bào)道(文/吳子鵬)近年來(lái),隨著數(shù)字技術(shù)的快速發(fā)展和用戶需求的不斷提升,我國(guó)數(shù)字醫(yī)療產(chǎn)業(yè)迅速崛起。主要體現(xiàn)在三方面:其一是醫(yī)院資產(chǎn)的數(shù)字化管理,醫(yī)院運(yùn)轉(zhuǎn)更加高效;其二是醫(yī)療過(guò)程的數(shù)字化
    的頭像 發(fā)表于 05-23 00:09 ?3639次閱讀
    基于RFID和AI等先進(jìn)技術(shù),<b class='flag-5'>讓</b>醫(yī)療保健<b class='flag-5'>更加高效</b>、準(zhǔn)確

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言: C語(yǔ)言是一種面向過(guò)程的編程語(yǔ)言。它具有底層的特性,能夠?qū)τ?jì)算機(jī)硬件進(jìn)行直接操作。
    的頭像 發(fā)表于 02-05 14:11 ?1634次閱讀

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來(lái)了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?485次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    如何選擇創(chuàng)建c語(yǔ)言和c++

    選擇創(chuàng)建 C 語(yǔ)言和 C++ 都需要綜合考慮多個(gè)因素。在決定使用哪種語(yǔ)言之前,我們需要對(duì)這兩種語(yǔ)言的特點(diǎn)、優(yōu)缺點(diǎn)、適用場(chǎng)景、學(xué)習(xí)成本等進(jìn)行全面的了解和對(duì)比。下面是關(guān)于選擇創(chuàng)建 C 語(yǔ)言和 C+
    的頭像 發(fā)表于 11-27 15:58 ?527次閱讀

    c++怎么開(kāi)始編程

    應(yīng)用程序、嵌入式系統(tǒng)和網(wǎng)絡(luò)應(yīng)用程序等各種領(lǐng)域。 在開(kāi)始編程之前,你需要安裝C++的編程環(huán)境。首先,你需要下載并安裝一個(gè)編譯器,比如微軟的Visual Studio、GNU的GCC或者Clang。這些編譯器可以將你的C++代碼編譯
    的頭像 發(fā)表于 11-27 15:56 ?820次閱讀

    c++多行注釋快捷鍵

    C++中,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個(gè)語(yǔ)句的方法。當(dāng)你希望暫時(shí)禁用一些代碼或者解釋特定部分代碼的作用時(shí),多行注釋是非常有用的。 在
    的頭像 發(fā)表于 11-22 10:24 ?7488次閱讀

    如何寫出高效優(yōu)美的C語(yǔ)言代碼

    電子發(fā)燒友網(wǎng)站提供《如何寫出高效優(yōu)美的C語(yǔ)言代碼.pdf》資料免費(fèi)下載
    發(fā)表于 11-18 10:55 ?0次下載
    如何寫出<b class='flag-5'>高效</b>優(yōu)美的<b class='flag-5'>C</b>語(yǔ)言<b class='flag-5'>代碼</b>

    Chapyter編碼更加高效

    相信很多小伙伴是Jupyter的重度使用者,本篇介紹一個(gè)利器 Chapyter 它將目前火爆的 ChatGPT 代碼解釋器與 Jupyter Notebook 結(jié)合了起來(lái),編碼更加高效
    的頭像 發(fā)表于 11-03 10:37 ?406次閱讀
    Chapyter<b class='flag-5'>讓</b>編碼<b class='flag-5'>更加</b>地<b class='flag-5'>高效</b>

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問(wèn)題,大家領(lǐng)略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《
    的頭像 發(fā)表于 10-30 16:35 ?746次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖