標籤:

C++ 11會帶來什麼影響?


實名反對某匿名用戶的回答C++ 11會帶來什麼影響? - 匿名用戶的回答 - 知乎

逐條回復如下:

  1. 沒有固定的編碼風格及主流範式:這正是C++的哲學,語言負責提供你做任何事的能力,但不會畫出條條框框限制你如何去做。就如Python和Perl的爭議一樣。如果上專業辭彙,這叫做多範式語言
  2. 沒有官方認證的最佳實踐:STL,以及c++11、14、17的各個類庫。
  3. 沒有靠譜可用的依賴編譯和第三方庫及軟體包的管理平台:這個是最大的不足,但也是有時代原因的。那個時代的老語言基本都並沒有這方面的考慮,當時連軟體工程這個概念都沒有,現在有包管理的都是新語言了。C++因歷史問題,遺留代碼很多,類庫良莠不齊而且版本不統一,也很難再亡羊補牢出個包管理工具了。其實這也是我看好Rust的原因……
  4. 沒有明確突出的擅長目標領域:服務端、遊戲、金融、大型工業應用……
  5. 沒有代表性的生態型的開源產品:同上,開源黨看不到,不代表不存在

  Qt自己就是一個生態:Qt 為什麼在桌面應用(Windows 平台)中不流行呢?

如果覺得那位答主在吹b,大可打開Qt官網:The future is written with Qt: Cross-platform software development for embedded desktop

  再比如這個:chenshuo/muduo

Watch 526  Star 2738  Fork 1672
690 commits  7 branches  53 releases  29 contributors

這可憐的數據,比起各種JS項目,何其諷刺?

  再比如asio,再比如libnetwork,再比如libevent,再比如LevelDb、再比如folly……

在開源er中口口相傳的神馬Angular.JS,神馬Node.JS,神馬Foo.JS,神馬Bar.JS,神馬XXX.JS,再比如99%的服務端和後端,有幾個能脫得開這些庫?

  再來幾個重量級的你讀過的最好的 C++ 開源代碼是什麼?

這算不算代表性的生態型的開源產品

綜上所述——C++不是用來寫Web的,從一開始就不是。可惜現在是互聯網泡沫最頂峰的時代,搞得許多人覺得好像世界上只有Python和JS了。

對了,大概還有人不知道,在金融領域,甚至連Web都是用C++寫的吧……

同樣,這個世界並不是只有瀏覽器和手機,如果只是這樣,那21世紀也不配稱作信息時代了。在這些背後,有更多更厚重,更龐大,更高端的東西,只不過不為大眾所知,這個大眾,包括許多所謂「IT從業人士」

另,編程語言排行榜里C++走低很正常,因為目前各大技術社區里的信息全被開源世界,或者說Web世界充斥了,統計出來自然差異如此巨大。不信上GitHub看看,隨便一個前端項目輕鬆三四位數star,但編譯語言的精品項目呢?

就如同媒體輿論。開源壟斷了IT輿論,正如媒體壟斷了時事輿論

媒體把持了輿論的入口,於是就把持了輿論,但這就真的代表真正的輿論了?長期混微博知道新浪和大V那一套的,或者知道SomeHu這一套的,或者關注前陣美國大選那一套的,不會搞不懂吧?

說白了,開源技術和Web技術利用先天親近開發者/用戶的優勢,以海量的接入人群而獲得了輿論上的絕對優勢,這僅僅是「量」,並不代表「質」。

更何況,就算是「量」,也未必如你所見,大眾所看到的,只是水面上的冰山罷了。

比如,是否有人有興趣統計下軍用信息產業一年的市場?亦或是電力領域信息產業一年的市場?再如林業呢?氣象呢?地質呢?金融領域呢?動畫產業呢?影視音產業呢?還有數都數不清的各個工業行業呢?

(我上份職業是在南網的雲南電網,就我所知,林業已經發射皮衛星了,雲網已開始部署數字化變電站全覆蓋和無人機巡線,並且準備玩皮衛星了。數字化變電站改造期間,每個變電站每年發布的項目金額平均七位數起,雲南有多少個變電站?這還是以區區雲南的人力成本計算的)

正如Mac和Linux都吹上天了,然而市場佔有率上依舊是Windows絕對優勢,這是為何?從開源生態角度來看,Mac這種親近用戶、擁抱開源的系統,怎麼都不應該是1%啊,更何況Web時代里,app天生就無視平台差異的。

(Mac對app開發者不友好,但對Web友好,對開源友好啊。能用unix,能用shell,能用包管理,能用gcc和clang,先天和開源技術棧無縫對接,這還不夠友好?你看前端開發在 Mac 之上,對比其它平台有哪些優勢?這裡面都把Mac吹上天了。前幾天還有個類似的問題又冒出來在我首頁刷屏了好久,不過暫時沒搜到)

===============================

回某匿名用戶回答:

1、然而在之後補的兩張圖中,Java和C的份額都在下降,而且C降得還更凶,總體下降了10個點和C++一樣,近期下降比C++恐怖的多。但C在自己的領域幾乎毫無敵手,不像C++還會被別的「更優秀」的語言所以擠占,所以很明顯是因為技術細分引發的份額下降。

實際上,C和C++本身就不適合開源,它們更多是存活在閉源領域。而這個你在統計里是看不到的——君不見市面上招個有能力的C程序員有多難,但這就能說明C已經死了么?

至於開源閉源哪個強么……去這個題目里慢慢扯皮吧,總之不要被開源世界一葉障目了。開源軟體界和閉源軟體界的水平有差距嗎? - 編程 - 知乎

2、最佳實踐方面,C++由於是多範式,不同領域有不同的最佳實踐。

主要分的是造輪子用輪子兩種實踐,造輪子可以看STL/Boost/Qt,用輪子看我列舉的那一大堆開源就行了,隨便哪個都能作為最佳實踐參考,這就是多範式

我個人是摯愛這種風格的,正因為現在技術細分越來越明顯,其實是不存在放之四海而皆準的「最佳實踐」的。

比如在性能極端領域,最佳實踐就是內嵌彙編、內嵌SIMD、模板元編程,但用到其他注重複用性、拓展性、維護性等的現代軟體工程領域,這是妥妥的作死。這兩者之間的矛盾完全無法調和,請問怎麼可能存在「最佳實踐」?

實際上,主流語言越來越多,各語言的平均市場份額逐漸下降,就是對「最佳實踐」的駁斥——如果有最佳實踐,還需要那麼多語言作甚?

3、該知友也許沒打算用JS做類比,但用來駁斥C++的那些點,正是以JS為代表的開源技術棧里最喜歡鼓吹的東西,所以我就用JS來舉例了。

4、其他地方么,見仁見智吧。歷史包袱任何語言都有,Python和JS都一大堆黑歷史。

更何況,在關於包管理工具的說明裡我的觀點已經很明確了——我並不否認歷史包袱給C++帶來的一系列問題,而且是幾乎無法彌補的問題。

C++由於委員會的扯皮,更新來的晚了,但總比不來好,而且從11到14到17,C++不但是在改進,更是在追趕現代潮流,它和更高級的現代語言的差距已經越來越小了。

5、如果用Modern C++的方式開發,絕對不存在「寫起來臃腫,出活很慢」的情況的。

用現有的輪子,已經可以做到一行代碼建http server,一行代碼完成map-reduce的——用的是Qt,久經商業領域考驗的成熟輪子。

再比如,Web領域可不是非C++不可的,Facebook甚至還自己優化PHP解釋器來做開發。那麼,為何他們還要用「寫起來臃腫,出活很慢」的C++寫Folly庫呢?


呵呵,這個問題,剛好可以看看我書中的這樣一個小節:

1.2.3 更簡單、更高效:C++11讓C++續寫傳奇

技術在不斷發展,C++也在不斷進步。自從斯大叔發明並實現了C++語言之後,在面向對象語言迅速發展的時代背景下,C++以其面向對象的語言特性、對C語言的良好兼容、以及極其接近C語言的性能效率,在工業界佔據了相當大的份額,成為程序設計語言中的無冕之王。在其後的發展中,C++又不斷引入新的內容。標準模板庫和Boost程序庫的出現、泛型程序設計的流行,使得C++牢牢佔據了TIOBE編程語言排行榜前三名的位置,成為業界最流行的程序設計語言之一,成為一個眾人傳頌的傳奇。

然而,隨著硬體技術的不斷發展,特別是多核技術的出現以及Java、C#等新語言的不斷湧現,C++的發展受到了很大的衝擊,在業界的應用範圍不斷萎縮。C++曾經是Visual Studio 6.0中的首選語言,但是在後繼版本的Visual Studio中,特別是在微軟推出.NET Framework之後,C++的地位不斷下滑,被後來居上的C#搶了風頭。很多鍾情於C++的程序員不禁發出這樣的感嘆:「C++老矣,尚能編否?」

雖然C++在發展歷程中經歷了上述小小的波折,但是應當看到,世界上還有無數的C++代碼在穩定地運行著,這些代碼還需要維護和升級。另外,C++在某些領域(比如,操作系統編程、遊戲開發、伺服器端開發等)仍具有不可替代的優勢,無數基於C++的新項目正在進行著。為了應對現代程序設計語言的發展及業界的需求,C++也積極汲取現代程序設計語言的精華,C++的新標準C++11C++11正是在這種背景之下應運而生的。

C++11是自1998年C++首次被ISO標準化以來變化最大的一個新標準,它主要在以下兩個方面對C++進行了革命性的改進和增強:

一方面,C++11讓C++更加易於使用。我們都知道,C++以其語法簡潔而著稱於世,雖然簡潔的語法受到編程高手們的喜愛。同時,C++也非常靈活而自由,我們幾乎可以在C++中完成任何我們想要完成的事情。簡潔、自由和靈活是一把雙刃劍,它讓C++擁有無限的能力,但同時也讓C++在程序員們的心目中成為一門難學難用難以掌握的編程語言,特別是讓一些初學者望而卻步,阻礙了C++的進一步發展。為了改變這一現狀,C++11加入了很多改善其易用性的語法特性,並從其他主流的編程語言(特別是Java)中借鑒吸收了很多旨在改善C++易用性的語法特點。例如,C++11提供了auto這種特殊的數據類型,使用它作為變數的數據類型,編譯器可以根據變數的初始值自動推斷其合理的真實數據類型,省去了程序員確定複雜變數的數據類型的繁瑣;C++11開始支持Lambda表達式,讓C++中匿名函數的定義和使用成為可能;C++11從Java和C#中借鑒了序列for循環語句,讓針對某個容器的循環遍歷更加簡單;C++11從Java中借鑒了函數屬性,從而可以對函數進行更加靈活的修飾。例如,我們可以使用noreturn指明一個函數沒有返回值,也可以使用final限制某個虛函數被派生類重載,函數屬性的引入滿足了我們對函數的不同需求。

另一方面,C++11讓C++的性能更高。相對於其他主流的高級編程語言而言,接近於低級語言的高性能表現,應該是C++最大的優勢了。但是C++11並不滿足於C++現有的性能表現,通過增加新的語法特性、改寫標準庫等手段,想榨乾C++身上最後的一滴性能血液。例如,C++11提供了對右值引用、移動語義的完全支持,解決了從函數返回一個大對象的問題;利用新的語法特性對標準庫進行了大規模的改寫,極大地提高了標準庫的性能表現;特別值得一提的是,為了適應當今越來越普及的並行計算,充分利用主流的多核CPU的計算資源,C++11在標準庫中對並行計算提供了全面的支持,我們可以通過線程thread對象輕鬆完成線程的創建,也可以通過條件變數對線程的執行情況進行控制。對並行計算的完全支持,讓C++11擁有了更加優異的性能表現。

正是C++11在這兩個方面的大力改進,不僅進一步增強了C++在性能方面的優勢,做到了揚長;同時也改善了C++的易用性,做到了避短,使得C++成為了一門「又快又好」的程序設計語言。這些新特性給C++注入了新的活力,使得C++重新煥發青春,帶來C++的復興。C++也必將續寫它那不朽的傳奇。

最關鍵的一點,我看好C++11對多線程的支持,這將讓他在多核心的伺服器編程上大展拳腳。


就我個人的經歷來看,影響非常大!簡單來說:1. 語法更簡潔,表現力更強了。前面有同學說這是受Java的影響,但我覺得更像是受python的影響。可以說用了C++11,你絕對不會想回到98的標準。

2. 更多實用的功能。尤其是線程庫,在這個多核的時代,顯得尤為重要。

3. 對FP的支持。尤其是lambda的引入,使用stl演算法更方便了。也更容易寫出邏輯清晰的代碼

4. 智能指針的引入讓內存管理更方便了。

5. 右值引用,進一步提高性能。

以上是我個人使用C++11後覺得能提高開發效率的一些特性,暫時就想到這麼多。

另外,看之前的討論,覺得很多把這個問題變成和其它語言的對比,個人覺得泛泛的討論哪種語言更好其實沒什麼意義。在我所經歷過的行業,從來沒用過Java,但我並不覺得Java比C++差,只是在這些行業C++更合適,而C++11的出現無疑更穩固了它在這些行業的地位。同樣Java等其它語言也在不停的演進,在它們所擅長的領域它們的地位其實也是愈發穩固


爽!


這個題目太大,雖然我個人C++經驗尚淺,但是我從Coding方面的直接感受就是,更加方便,更加易用。通俗的說一句,寫起代碼來爽多了! C++在伺服器端開發是一個正確的選擇。


C++11 對 move 語義的支持不夠完美,容易埋雷。

但是對於寫庫的人來說,這是極好的一個版本。


市場可不是看標準走的。

對C++一部分程序員來說,寫起來省事一些了,但學習成本也同樣增加了。

個人感覺除了C++粉絲外,C++11並沒有啥影響,但看論壇就知道了,並沒有多少人討論C++11。

結論就是沒啥影響。


人家樓主問的是C++的影響,但是下邊確有一堆人被帶著跑偏。爭論C++到底是不是明天就死了。:)

==================================================================

從我工作接觸的地方來看的話,寫遊戲你是非得用C++不可的,除非你不準備做遊戲主程序和邏輯,只想寫個demo。那你可以用咖啡語言。伺服器上跑的代碼很多也是C++寫的。對中型或者小公司來說,C++配合Cocos2d-x,linux系統,馬雲那裡租一個便宜的伺服器,一個遊戲就出爐了。

至於C++11的影響,我感覺是有影響,但是具體有多大 到什麼程度就很值得懷疑了。

lambda表達式的確是個很好的東西,但是他在很好用的同時,也變得很難掌握。

C++委員會不停的在為C++增加新特徵,讓這門語言更加靈活,這也正是C++設計的時候強調的東西,靈活性,泛用性。(你甚至能用C++去寫web只要你不嫌費事。)但是特徵越多就意味著對於入門的人來說越難掌握。光記住這麼多關鍵字和操作符每個是什麼意思每個可以幹什麼就很頭疼了,更別說靈活運用了。所以任何C++程序猿或者用C++工作的程序猿,幾乎沒有初級這個說法。都是至少接近中級或者直接水平就達到中級的。因為C++你想很好的掌握這門語言是很難的。他的特性太多了,他自身的內容太多了。

舉個例子,一個公司他的一部分代碼是C++11出台之前寫的,甚至他的框架是C 99 寫的,那他之後的代碼 可能為了配合老代碼 一起工作時不出問題,就不會採用C++11。

而且老版本的VS上面C++11寫的代碼也沒法編譯通過,太新版的VS比如VS2015可能商業公司不太會用,商業公司他用肯定會採用最穩定的 久經考驗的版本,比如VS2010這種。那麼問題來了,VS2010不支持C++11 .怎麼辦。。那即便C++11再好再牛逼 也沒法用不是嗎?微軟為了賣他的VS2016肯定也不會免費幫你把VS2010升級到能支持C++11吧www

所以當下來看的話我覺得C++11對於IT業界來說,影響應該沒那麼大,但是過個幾年,比如3~5年,徹底普及之後,可能會被廣泛的採用吧。因為C++11的確很方便,auto還有decltype,讓你可以不用從幾百個CPP幾百萬行代碼里去找一個變數他到底是什麼類型,直接auto var * 就可以定義指向這個對象的指針 然後去初始化他了。

順便反對一下說C++沒有好的開源lib的人,Cocos2dx 難道不是一個好的開源嗎?OpenGl也是一個很好的第三方庫啊,甚至如果你專註win平台的開發,你還可以用dx 。 而且C++/C#/Java這三門語言互相操作調用對方編寫的動態庫技術也已經有了。所以,綜上,未來關於C++和C++11的前景,我還是很看好的wwww

以上是關於開發人員的。

對於想入編程這個坑的人來說,都還沒入坑呢,那C++的標準再怎麼變,和他有關係嗎?說不定會被C++11寫出的很多酷炫又看著很怪異的語法所吸引而入坑呢。比如我不是碼農,我只是一個司機,那你語言出什麼標準管我什麼事,我只要開好我的車就行了。是唄?


個人觀點,新標準會讓現有的C++程序員更爽,但不會吸引非C++程序員來用C++。

內存模型,lambda,這兩個在我看來是最重要的。


影響很有限。

一方面,老廠里的C++庫和基礎件基本是98標準寫的,像這種龐大的十幾年積累下來的infrastructure是不可能一朝一夕改過來的。

另一方面,新廠(新項目)選型一般如果不是非C++不可的業務,幾乎是不會叫C++這種老派玩意的鐘的,招人成本高不說,寫起來也臃腫,出活很慢。

而且,C++自身幾乎沒有一點現代語言的感覺:沒有固定的編碼風格及主流範式,沒有官方認證的最佳實踐,沒有靠譜可用的依賴編譯和第三方庫及軟體包的管理平台,沒有明確突出的擅長目標領域,沒有代表性的生態型的開源產品。常言道「編程語言生非異也,善假於物也」,而C++標準委員會的老專家們似乎對此並不買賬。

綜上所述,總體來說,C++的凌夷可以說勢所難免,即使C++11、C++14、C++17層出不窮也難以再挽回敗局,事實證明也確實如此:

轉自: http://www.tiobe.com/tiobe-index/cplusplus/

---------------------------- 萬惡的分割線 ----------------------------

既然被 @諸葛不亮 反對了,當然要出來說幾句。

C++沒有固定的編碼風格和主流範式絕對不是什麼提倡的事,這其實是C++委員會內部不同政治和口味派系不斷鬥爭妥協的結果,也正是這種鬥爭妥協讓C++的發展一直很畸形。

STL這種絕對不是C++官方認證的最佳實踐,且不說STL版本林立,寫庫和寫應用(至少在C++里)本是兩種截然的taste。用STL這種寫庫的風格和實踐來指導自己寫應用,就像照著成功人士的自傳妄圖複製成功一樣可笑。

另外我從來沒有拿JS和C++比較的潛台詞在,我也沒有抨擊C++在開源界的不作為,我純粹只是覺得C++在語言上的改進來的太晚了,而且不少改進都還明顯帶著投鼠忌器的半吊子態度或者是刻意標新立異的成分在。程序員群眾的眼睛是雪亮的,既然C++委員會完全不在乎我們的心智負擔,我們一旦有機會就會用腳投票。

@諸葛不亮 同學還以TIOBE統計的不可靠性和新興語言蠶食老派技術的借口來為C++辯護,但仔細看看TIOBE的Java、C、甚至彙編語言的統計,就會發現這種借口完全是站不住腳的:

(可以明顯看到Java、C以及彙編語言並沒有明顯的像C++那樣長時間持續性的跌滑趨勢)

其實根本的原因就是C++一定程度上對程序員非常地不友好,即使它在有些領域仍然不可代替,也改變不了大多數程序員都不喜歡用C++以及隨時準備使用新興語言取代C++的現實。


C++11 也算使用了幾年來,總體感覺很爽。

1. 代碼更加簡潔,auto啊之類的用起來很爽。

2. 性能有所提高,std::move很有用

3. 考慮到向後兼容,api頭文件盡量不要暴露C++11語法

4. 受編譯器限制大,不太可能頻繁升級gcc,導致很多新語法能看不能用

5. 實際使用的新語法有限,thread,regex,lambda基本沒用,shared_ptr這些也沿用boost,沒有替換過來。

6. 教育成本高,收益不太好評估,用的爽不如穩定實在。


一想到公司伺服器 GCC 不支持 c++11就淚如雨下


感覺來的太晚。。。


我只知道模板,默參,重載讓庫用的飛起。自己寫自己的庫。


C++委員會唯一有價值的地方就是持續給他們自己和C++ Compiler developer創造工作機會。


推薦閱讀:

如何遍歷 std::tuple?
目前是否有C++提案是關於在編譯期獲取類/結構體成員變數的?
如今C++在非底層環境下還有多少地位?
為什麼非指針對象不能使用const成員函數?

TAG:C | C標準 | C11 |