開(kāi)始使用C++11的9個(gè)理由
如果你的代碼工作正常并且表現(xiàn)良好,你可能會(huì)想知道為什么還要使用C++ 11。當(dāng)然了,使用用最新的技術(shù)感覺(jué)很好,但是事實(shí)上它是否值得呢?在我看來(lái),答案毫無(wú)疑問(wèn)是肯定的。我在下面給出了9個(gè)理由,它們分為兩類:性能優(yōu)勢(shì)和開(kāi)發(fā)效率。
獲得性能優(yōu)勢(shì)
理由1:move語(yǔ)義(move semantics)。簡(jiǎn)單的說(shuō),它是優(yōu)化復(fù)制的一種方式。有時(shí)候復(fù)制很顯然是浪費(fèi)的。如果你從一個(gè)臨時(shí)的string對(duì)象復(fù)制內(nèi)容,簡(jiǎn)單的復(fù)制指針到字符緩沖區(qū)將比創(chuàng)建一個(gè)新的緩沖區(qū)再?gòu)?fù)制要高效得多。他之所以能工作是因?yàn)樵磳?duì)象超出了范圍。
然而,在這以前C++并沒(méi)有判斷源對(duì)象是不是臨時(shí)對(duì)象的機(jī)制。move語(yǔ)義通過(guò)除了復(fù)制操作外還允許你有一個(gè)move構(gòu)造函數(shù)(move constructor)和一個(gè)move賦值運(yùn)算(move assignment)符來(lái)提供這個(gè)機(jī)制。
你知道嗎?當(dāng)你在Visual Studio 2010中使用標(biāo)準(zhǔn)庫(kù)中的類如string或vector時(shí),它們已經(jīng)支持move語(yǔ)義了。這可以防止不必要的的復(fù)制從而改善性能。
通過(guò)在你的類中實(shí)現(xiàn)move語(yǔ)義你可以獲得額外的性能提升,比如當(dāng)你把它們存儲(chǔ)到STL容器中時(shí)。還有,move語(yǔ)義不僅可以應(yīng)用到構(gòu)造函數(shù),還可以應(yīng)用到方法(如vector的push_back方法)。
理由2:通過(guò)使用類別屬性(type traits,如is_floating_point)和模板元編程(template metaprogramming,如enable_if template),你可以為某些特定的類型定制模版,這可以實(shí)現(xiàn)優(yōu)化。
理由3:哈希表現(xiàn)在已經(jīng)是標(biāo)準(zhǔn)實(shí)現(xiàn)的了,它提供更快速的插 入、刪除和查找,這在處理大量數(shù)據(jù)時(shí)很有用。你現(xiàn)在可以隨便使用unordered_map, unordered_multimap, unordered_set 和unordered_multiset這幾種數(shù)據(jù)結(jié)構(gòu)了。
提高效率
提高效率不僅都是在代碼性能方面,開(kāi)發(fā)時(shí)間也是寶貴的。C++ 11可以讓你的代碼更短、更清晰、和更易于閱讀,這可以讓你的效率更高。
理由4:auto關(guān)鍵字可以自動(dòng)推斷類型,所以下面的代碼:
vector<vector<MyType>>::const_iterator it = v.begin()現(xiàn)在可以很簡(jiǎn)單的寫(xiě)成:
auto it = v.cbegin()盡管有些人會(huì)說(shuō),它隱藏了類型信息,在我看來(lái)它利大于弊,因?yàn)樗鼫p少了視覺(jué)混換并展示了代碼的行為,還有它可以讓你我少打很多字!
理由5:Lambda表達(dá)式提供了一種方法來(lái)定義匿名方法對(duì)象(實(shí)際上是閉包),這是代碼更加線性和有規(guī)律可循。這在和STL算法結(jié)合使用時(shí)很方便:
bool is_fuel_level_safe()
{
return all_of(_tanks.begin(), _tanks.end(),
[this](Tank& t) { return t.fuel_level() > _min_fuel_level; });
}
理由6:新的智能指針(smart pointer)替換了有問(wèn)題的auto_ptr,你可以不用擔(dān)心內(nèi)存的釋放并移除相關(guān)釋放內(nèi)存的代碼了。這讓代碼更清晰,并杜絕了內(nèi)存泄露和查找內(nèi)存泄露的時(shí)間。
理由7:把方法作為first class object是一個(gè)非常強(qiáng)大的特性,這讓你的代碼變得更靈活和通用了。C++的std::function提供了這方面的功能。方法提供一種包裝和傳遞任何可調(diào)用的東西-函數(shù)指針, 仿函數(shù)(functor), lambda表達(dá)式等。
理由8:還有許多其它小的功能,如override、final關(guān)鍵字和nullptr讓你的代碼意圖更明確。對(duì)我來(lái)說(shuō),減少視覺(jué)混亂和代碼中能夠更清楚地表達(dá)我的意圖意味著更高興、更高效。
另一個(gè)開(kāi)發(fā)效率的方面是錯(cuò)誤檢測(cè)。如果你的錯(cuò)誤在運(yùn)行時(shí)發(fā)生,這意味著你至少需要運(yùn)行軟件,并可能得通過(guò)一系列步驟來(lái)重現(xiàn)錯(cuò)誤,這需要時(shí)間。
C++ 11提供了一種方法來(lái)檢查先決條件并盡早的在可能的時(shí)機(jī)捕獲錯(cuò)誤-編譯過(guò)程中,在你運(yùn)行代碼前。這就是理由9。
這是通過(guò)靜態(tài)斷言(static_assert)和類別屬性模版實(shí)現(xiàn)的。這種方法的另一個(gè)好處是,它不需要占用任何的運(yùn)行時(shí)開(kāi)銷,沒(méi)有什么性能損失!
現(xiàn)在開(kāi)始掌握C++ 11
在C++ 11標(biāo)準(zhǔn)中除了上描述的還有更多的改動(dòng)和新功能,它需要一整本數(shù)來(lái)描述。不過(guò),我相信它們是值得你花時(shí)間去學(xué)習(xí)的。你將省去以往花在提高效率上的時(shí)間。很多主流的編譯器已經(jīng)開(kāi)始支持C++ 11的一些標(biāo)準(zhǔn)了。還等什么?開(kāi)始吧!
相關(guān)文章

網(wǎng)絡(luò)工程師必備的6款配置文件編輯神器:替代Notepad++!
本期文章介紹了六種網(wǎng)工必備工具,這些工具是網(wǎng)絡(luò)工程師日常工作中必不可少的,也是那些立志成為網(wǎng)絡(luò)工程師的人應(yīng)該熟悉的2026-04-13
首個(gè)版本v1.111已上線! VS Code開(kāi)啟周更狂飆模式
026年3月10日,微軟宣布將Visual Studio Code(VS Code)更新節(jié)奏從月更提速至周更,并發(fā)布首個(gè)周更版本v1.1112026-03-11
AI直接調(diào)試瀏覽器! VS Code重大更新發(fā)布
還在手動(dòng)打開(kāi)瀏覽器、點(diǎn)擊按鈕、檢查控制臺(tái)報(bào)錯(cuò)?太累了!現(xiàn)在,最新的VS Code 1.110中AI可以直接調(diào)試瀏覽器2026-03-10
vc 6.0代碼是正確編譯無(wú)法運(yùn)行怎么解決?
今天帶大家來(lái)共同學(xué)習(xí)VC++6.0無(wú)法正常運(yùn)行怎么辦?下面就是詳細(xì)完整的操作步驟,快跟小編一起來(lái)學(xué)習(xí)一下2026-02-27
vscode調(diào)試c代碼始終找不到exe可執(zhí)行文件的詳細(xì)及解決辦法
在 VS Code 中調(diào)試 C++ 項(xiàng)目時(shí),常見(jiàn)報(bào)錯(cuò):“無(wú)法啟動(dòng)調(diào)試會(huì)話:找不到可執(zhí)行文件”,這個(gè)問(wèn)題問(wèn)題通常是由于環(huán)境配置不當(dāng)、缺少編譯步驟、路徑設(shè)置錯(cuò)誤、或是launch.json2026-02-27
vscode入門(mén)! 小白都能看懂的VS Code保姆級(jí)級(jí)使用教程
相對(duì)于其它前端工具來(lái)說(shuō),VSCode顯得更加的流暢,今天就將我的學(xué)習(xí)經(jīng)歷和大家分享一下,希望可以幫助到有需要的人2026-02-27
2026年真正值得裝、用得上、不雞肋的 VSCode 插件,其實(shí)沒(méi)那么多——挑10個(gè)“神級(jí)”不難,但得是每天打開(kāi)就用、關(guān)掉就難受的那種2026-02-10
VS Code 和 VSCodium怎么選? vscode 和 vscodium之間的區(qū)別
咱們今天就來(lái)聊聊 Visual Studio Code (VS Code) 和 VSCodium的相似與區(qū)別,詳細(xì)請(qǐng)看下文介紹2026-01-10
如何啟用.NET Framework3.5? 一鍵安裝net3.5解決軟件依賴問(wèn)題
你是否曾在安裝某些軟件時(shí)遇到過(guò)“需要.NET Framework 3.5”的提示?實(shí),只需要幾步簡(jiǎn)單的操作,你就可以輕松解決這個(gè)問(wèn)題2025-10-28
VS Code中Java擴(kuò)展代碼重構(gòu)功能的使用詳解
在軟件開(kāi)發(fā)過(guò)程中,重構(gòu)是一個(gè)非常重要的環(huán)節(jié),重構(gòu)可以提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性,使代碼更加健壯和易于理解,本文將介紹如何使用 VSCode 進(jìn)行 Java 代碼重構(gòu)2025-09-20





