開始使用C++11的9個理由

如果你的代碼工作正常并且表現良好,你可能會想知道為什么還要使用C++ 11。當然了,使用用最新的技術感覺很好,但是事實上它是否值得呢??在我看來,答案毫無疑問是肯定的。我在下面給出了9個理由,它們分為兩類:性能優勢和開發效率。

獲得性能優勢

理由1:move語義(move semantics)。簡單的說,它是優化復制的一種方式。有時候復制很顯然是浪費的。如果你從一個臨時的string對象復制內容,簡單的復制指針到字符緩沖區將比創建一個新的緩沖區再復制要高效得多。他之所以能工作是因為源對象超出了范圍。

然而,在這以前C++并沒有判斷源對象是不是臨時對象的機制。move語義通過除了復制操作外還允許你有一個move構造函數(move constructor)和一個move賦值運算(move assignment)符來提供這個機制。

你知道嗎?當你在Visual Studio 2010中使用標準庫中的類如string或vector時,它們已經支持move語義了。這可以防止不必要的的復制從而改善性能。

通過在你的類中實現move語義你可以獲得額外的性能提升,比如當你把它們存儲到STL容器中時。還有,move語義不僅可以應用到構造函數,還可以應用到方法(如vector的push_back方法)。

理由2:通過使用類別屬性(type traits,如is_floating_point)和模板元編程(template metaprogramming,如enable_if template),你可以為某些特定的類型定制模版,這可以實現優化。

理由3:哈希表現在已經是標準實現的了,它提供更快速的插入、刪除和查找,這在處理大量數據時很有用。你現在可以隨便使用unordered_map, unordered_multimap, unordered_set 和unordered_multiset這幾種數據結構了。

提高效率

提高效率不僅都是在代碼性能方面,開發時間也是寶貴的。C++ 11可以讓你的代碼更短、更清晰、和更易于閱讀,這可以讓你的效率更高。

理由4:auto關鍵字可以自動推斷類型,所以下面的代碼:

  1. vector<vector<MyType>>::const_iterator?it?=?v.begin()?

現在可以很簡單的寫成:

  1. auto?it?=?v.cbegin()?

盡管有些人會說,它隱藏了類型信息,在我看來它利大于弊,因為它減少了視覺混換并展示了代碼的行為,還有它可以讓你我少打很多字!

理由5:Lambda表達式提供了一種方法來定義匿名方法對象(實際上是閉包),這是代碼更加線性和有規律可循。這在和STL算法結合使用時很方便:

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)替換了有問題的auto_ptr,你可以不用擔心內存的釋放并移除相關釋放內存的代碼了。這讓代碼更清晰,并杜絕了內存泄露和查找內存泄露的時間。

理由7:把方法作為first class object是一個非常強大的特性,這讓你的代碼變得更靈活和通用了。C++的std::function提供了這方面的功能。方法提供一種包裝和傳遞任何可調用的東西-函數指針, 仿函數(functor), lambda表達式等。

理由8:還有許多其它小的功能,如override、final關鍵字和nullptr讓你的代碼意圖更明確。對我來說,減少視覺混亂和代碼中能夠更清楚地表達我的意圖意味著更高興、更高效。

另一個開發效率的方面是錯誤檢測。如果你的錯誤在運行時發生,這意味著你至少需要運行軟件,并可能得通過一系列步驟來重現錯誤,這需要時間。

C++ 11提供了一種方法來檢查先決條件并盡早的在可能的時機捕獲錯誤-編譯過程中,在你運行代碼前。這就是理由9

這是通過靜態斷言(static_assert)和類別屬性模版實現的。這種方法的另一個好處是,它不需要占用任何的運行時開銷,沒有什么性能損失!

現在開始掌握C++ 11

在C++ 11標準中除了上描述的還有更多的改動和新功能,它需要一整本數來描述。不過,我相信它們是值得你花時間去學習的。你將省去以往花在提高效率上的時間。很多主流的編譯器已經開始支持C++ 11的一些標準了。還等什么?開始吧!


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451127.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL批量update數據(更新的數據值不同)

(一)純mysql: ?UPDATE my_table SETstatus CASE idWHEN 1 THEN 3WHEN 2 THEN 4WHEN 3 THEN 5END,title CASE idWHEN 1 THEN New Title 1WHEN 2 THEN New Title 2WHEN 3 THEN New Title 3END WHERE id IN (1,2,3) (二)mybatis寫法 1:foreach <update id"batchUpd…

webpack+vue-cli 中proxyTable配置接口地址代理

在項目開發的時候&#xff0c;接口聯調的時候一般都是同域名下&#xff0c;且不存在跨域的情況下進行接口聯調&#xff0c;但是當我們現在使用vue-cli進行項目打包的時候&#xff0c;我們在本地啟動服務器后&#xff0c;比如本地開發服務下是 http://localhost:8080 這樣的訪問…

AMQP 協議介紹

RabbitMQ 是遵從AMQP 協議的&#xff0c; 換句話說&#xff0c; RabbitMQ 就是AMQP 協議的Erlang 的實現(當然RabbitMQ 還支持STOMP2 、MQTT3 等協議) 0 AMQP 的模型架構和RabbitMQ 的模型架構是一樣的&#xff0c;生產者將消息發送給交換器&#xff0c;交換器和隊列綁定。當生…

關聯表多數據的批量insert (批量導入,測試19W條數據用時46秒)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、業務需求 &#xff1a;作多個批量導入 &#xff0c;根據業務不同&#xff0c;每條數據導入前作各種驗證&#xff0c; 導入后提示驗證…

Java已死?九百萬程序員說不

Java沒死&#xff0c;事實上它擁有足夠的能量讓你的應用跑起來。那些對Java吹毛求疵人頻繁地聚焦在一些小眾問題上&#xff0c;總是和其他技術或者語言做些不公平的對比&#xff0c;這些語言并沒有像Java一樣得到廣泛應用及長遠的歷史。 現在的小孩都能學Java&#xff0c;它在…

Linux SSH遠程管理故障如何排查?

SSH遠程管理故障排查方案&#xff1a;1、檢測兩個機器是否暢通兩個機器之間是否暢通&#xff0c;查看物理鏈路是否有問題(網線網卡、IP是否正確)第1步&#xff1a;物理鏈路是否暢通&#xff0c;比喻為“高速公路是否暢通”ping 排查客戶端到服務端的線路問題&#xff0c;ping是…

CSS中position的absolute和relative用法

static: HTML元素的默認定位方式absolute: 將對象從文檔流中拖出&#xff0c;使用left&#xff0c;right&#xff0c;top&#xff0c;bottom等屬性進行絕對定位。而其層疊通過z-index屬性定義。絕對定位的元素的位置相對于最近的已定位父元素&#xff0c;如果元素沒有已定位的父…

Spring HttpMessageNotReadableException異常

&#xff08;一&#xff09;現象 我們在進行服務間的rpc調用時&#xff0c;可能會遇到org.springframework.http.converter.HttpMessageNotReadableException異常。 其具體報錯如下&#xff1a; {"timestamp": 1456043810789,"status": 400,"error…

解決 -- java 調用webservice 服務端收到參數為null

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的客戶端和服務端都寫的很簡單&#xff0c;只是調用服務的時候&#xff0c; 服務端得不到參數&#xff0c;后來發現只改一個地方就可…

fastJson性能測試

測試裝備&#xff1a; mac pro 6核12線程 測試代碼&#xff1a; &#xff08;1&#xff09;序列化對象&#xff1a; import lombok.Data;Data public class User {int id;String name;int age;String address; } &#xff08;2&#xff09;序列化邏輯&#xff1a; import…

避免流量高峰期CDN問題的10個方法

在視頻流媒體中&#xff0c;因平臺火爆而出現問題是件好事。至少&#xff0c;這比根本沒有觀眾要好。\\也許你正在使用世界級的CDN&#xff0c;但是&#xff0c;在大型賽事期間&#xff0c;當CDN的服務器和對等點流量變得飽和的時候&#xff0c;一些用戶還是無法享受到流暢的體…

Android應用進入爆發期 手機游戲仍是市場重心

近日&#xff0c;91無線發布了《91無線移動應用發展趨勢報告&#xff08;Android版&#xff09;》。報告顯示&#xff0c;2012年&#xff0c;無論Android移動應用用戶下載還是開發者研發均呈爆發態勢&#xff0c;手機游戲仍是市場重心所在。同時&#xff0c;Android移動應用下載…

MQTT Client軟件-MQTTBox

最近發現了一個連接mqtt broker的軟件&#xff1a;MQTTBox。GitHub地址&#xff1a;https://github.com/workswithweb/MQTTBox 官網網站的介紹為&#xff1a;使用MQTTBox增強你的物聯網流程 MQTT客戶端特性 支持TCP、TLS、Web Sockets和安全的Web Sockets連接MQTT服務器支持各種…

fastJson toJSONString注意點

fastJosn是阿里爸爸推出一款高性能序列化工具&#xff0c;號稱最快的json序列化工具。不過好像也就那樣&#xff0c;在量比較大的時候優勢才會明顯。單次序列化時間還是會達到幾十毫秒的級別。 Fastjson is a Java library that can be used to convert Java Objects into the…

WebService中文件傳輸

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 WebService處理傳遞普通的信息&#xff0c;還可以傳輸文件&#xff0c;下面介紹WebService是怎么完成文件傳輸的。 1、 首先編寫服務器端…

Django框架-Form組件

一、DjangoForm組件介紹 我們之前在html頁面中利用form表單向后端提交數據時&#xff0c;都會寫一些獲取用戶輸入的標簽并且用form標簽把它們包起來。 與此同時我們在好多場景下都需要對用戶的輸入做校驗&#xff0c;比如驗證用戶是否輸入&#xff0c;輸入的長度和格式等是否正…

中國經濟轉型知易行難

摘要&#xff1a;一個亞洲國家正在崛起&#xff0c;出口機器勢不可擋&#xff0c;財富快速增長&#xff0c;覺得美國已是過去&#xff0c;自己的時代已經到來。這是2012年的中國&#xff1f;沒錯———但也是上世紀80年代的日本。 美國《芝加哥論壇報》網站5月20日文章&#xf…

進程和線程的剖析

進程和線程的區別&#xff1f;什么時候用進程&#xff1f;什么時候用線程&#xff1f; 答&#xff1a;首先得知道什么是進程什么是線程&#xff1f; 我的理解是進程是指在系統中正在運行的一個應用程序&#xff1b;程序一旦運行就是進程&#xff0c;或者更專業化來說&#xff1…

解決 java.net.ConnectException: Connection refused: connect 異常

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、 我的情況很簡單&#xff1a; 只是因為我調用服務端接口方法包名沒有寫對&#xff0c;應該如下面代碼中這樣寫&#xff1a; call.…

主席樹的各類模板(區間第k大數【動,靜】,區間不同數的個數,區間=k的個數)...

取板粗 好東西來的 1.&#xff08;HDOJ2665&#xff09;http://acm.hdu.edu.cn/showproblem.php?pid2665 &#xff08;POJ2104&#xff09;http://poj.org/problem?id2104 &#xff08;POJ2761&#xff09;http://poj.org/problem?id2761 題意&#xff1a;求區間第K大&…