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

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

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

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

C++的新標(biāo)準(zhǔn)又雙叒叕要到來了,C++20要來了!

5RJg_mcuworld ? 來源:lq ? 2018-12-05 13:43 ? 次閱讀

C++的新標(biāo)準(zhǔn)又雙叒叕要到來了,是的,C++20要來了!

圖片來源:udemy.com

幾周前,C++標(biāo)準(zhǔn)委會歷史上規(guī)模最大的一次會議(180人參會)在美國San Diego召開,這次的會議上討論確定哪些特性要加入到C++20中,哪些特性可能加入到C++20中。在明年二月份的會議當(dāng)中將正式確定所有的C++20特性。

這次會議討論的提案也是非常之多,達到了創(chuàng)紀(jì)錄的274份,C++20的新特性如果要一一列出的話將是一份長長的清單,因此本文將只評論大部分確定要加入和可能加入到C++20的重要特性,讓讀者對C++的未來和演進趨勢有一個基本的了解。

C++20中可能增加哪些重要特性,下面這個圖可以提供一個參考。

下面是本文將評論的將進入和可能進入C++20的重要特性:

Concepts

Ranges

Modules

Coroutines

Reflection

接下來讓我們慢慢揭開C++20的面紗,看看這些特性到底是什么樣的,它們解決了什么問題。

Concepts

在談Concepts之前我想先介紹一下Concepts提出的背景和原因。眾所周知,因為C++的模版和模版元具備非常強大的泛型抽象能力并且是zero overhead,所以模版在C++中備受推崇,大獲成功,在各種C++庫(如STL)中被廣泛使用。

然而,模版編程還存在一些問題,比如有些模版的代碼寫起來比較困難,讀起來比較難懂,尤其是編譯出錯的時候,那些糟糕的讓人摸不著頭腦的錯誤提示讓人頭疼。因此,C++之父Bjarne Stroustrup很早就希望對模版做一些改進,讓C++的模版編程變得簡單好寫,錯誤提示更明確。他早在1987年就開始做這方面的嘗試了。

C++之父Bjarne Stroustrup

具體思路就是給模版參數(shù)加一些約束,這些約束相比之前的寫法具有更強的表達能力和可讀性,會簡化C++的泛型模版代碼的編寫。

所以Concepts的出現(xiàn)主要是為了簡化泛型編程,一個Concept就是一個編譯期判斷,用于約束模版參數(shù),Concepts則是這些編譯期判斷的合集。下面通過一個例子來展示Concepts是如何簡化模版編程的。

templateclassB{public:templatetypenamestd::enable_if_t::value,std::string>to_string()const{return"ClassB<>";}};Bb1;//OKstd::cout<b2;//OKstd::cout<

比如有這樣一個類B,我們調(diào)用它的成員函數(shù)tostring時,對T類型進行限定,即限定T類型是std::string的可轉(zhuǎn)換類型,這樣做的目的是為了更安全,能在編譯期就能檢查錯誤。這里通過C++14的std::enableif_t來對T進行限定,但是長長的enableift看起來比較冗長繁瑣,頭重腳輕。來看看用Concepts怎么寫這個代碼的。

templateconceptCastableToString=requires(Ta){{a}->std::string;};templateclassD{public:std::stringto_string()constrequiresCastableToString{return"ClassD<>";}};

可以看到,requires CastableToString比之前長長的enableift要簡潔不少,代碼可讀性也更好,CastableToString就是一個Concept,一個限定T為能被轉(zhuǎn)換為std::string類型的Concept,通過requires相連接,語義上也更明確了,而且這個Concept還可以復(fù)用。

Concepts的這個語法也可能在最終的C++20中有少許不同,有可能還會變得更簡潔,現(xiàn)在語法有幾個候選版本,還沒最終投票確定。

Ranges

相比STL,Ranges是更高一層的抽象,Ranges對STL做了改進,它是STL的下一代。為什么說Ranges是STL的未來?雖然STL在C++中提供的容器和算法備受推崇和廣泛被使用,但STL一直存在兩個問題:

STL強制你必須傳一個begin和end迭代器用來遍歷一個容器;

STL算法不方便組合在一起。

STL必須傳迭代器,這個迭代器僅僅是輔助你完成遍歷序列的技術(shù)細節(jié),和我們的函數(shù)功能無關(guān),大部分時候我們需要的是一個range,代表的是一個比迭代器更高層的抽象。

那么Ranges到底是什么呢?Ranges是一個引用元素序列的對象,在概念上類似于一對迭代器。這意味著所有的STL容器都是Ranges。在Ranges里我們不再傳迭代器了,而是傳range。比如下面的代碼:

STL寫法:

std::vectorv{1,2};std::sort(v.begin(),v.end());

Ranges寫法:

std::sort(v);

STL有時候不方便將一些算法組合在一起,來看一個例子:

std::vectorv{1,2,3,4,5};std::vectorevent_numbers;std::copy_if(v.begin(),v.end(),std::back_inserter(event_numbers),[](inti){returni%2==0;});std::vectorresults;std::transform(event_numbers.begin(),event_numbers.end(),std::back_inserter(event_numbers),[](inti){returni*2;});for(intn:results){std::cout<

上面這個例子希望得到vector中的偶數(shù)乘以2的結(jié)果,需求很簡單,但是用STL寫起來還是有些冗長繁瑣,中間還定義了兩個臨時變量。如果用Ranges來實現(xiàn)這個需求,代碼就會簡單得多。

autoresults=v|ranges::view::filter([](inti){returni%2==0;})|ranges::view::transform([](inti){returni*2;});

用Concetps我們可以很方便地將算法組合在一起,寫法更簡單,語義更清晰,并且還可以實現(xiàn)延遲計算避免了中間的臨時變量,性能也會更好。

Concepts從設(shè)計上改進了之前STL的兩個問題,讓我們的容器和算法變得更加簡單好用,還容易組合。

Modules

一直以來C++一直通過引用頭文件方式使用庫,而其他90年代以后的語言比如JavaC#、Go等語言都是通過import包的方式來使用庫。現(xiàn)在C++決定改變這種情況了,在C++20中將引入Modules,它和Java、Go等語言的包的概念是類似的,直接通過import包來使用庫,再也看不到頭文件了。

為什么C++20不再希望使用#include方式了?因為使用頭文件方式存在不少問題,比如有include很多模版的頭文件將大大增加編譯時間,代碼生成物也會變大。而且引用頭文件方式不利于做一些C++庫和組件的管理工具,尤其是對于一些云環(huán)境和分布式環(huán)境下不方便管理,C++一直缺一個包管理工具,這也是C++被吐槽得很多的地方,現(xiàn)在C++20 Modules將改變這一切。

Modules在程序中的結(jié)構(gòu)如下圖:

上面的圖中,每個方框表示一個翻譯單元,存放在一個文件里并且可以被獨立編譯。每個Module由Module接口和實現(xiàn)組成,接口只有一份,實現(xiàn)可以有多份。

Modules接口和實現(xiàn)的語法:

exportmodulemodule_name;modulemodule_name;

使用Modules:

importmodule_name;

Modules允許你導(dǎo)出類,函數(shù),變量,常量和模版等等。

接下來看一個使用Modules的例子:

importstd.vector;//#includeimportstd.string;//#includeimportstd.iostream;//#includeimportstd.iterator;//#includeintmain(){usingnamespacestd;vectorv={"Socrates","Plato","Descartes","Kant","Bacon"};copy(begin(v),end(v),ostream_iterator(cout," "));}

可以看到不用再include了,直接去import需要用到的Modules即可,是不是有種似曾相識的感覺呢。曾看到一個人說如果C++支持了Modules他就會從Java回歸到C++,也說明這個特性也是非常受關(guān)注和期待的。

Coroutines

很多語言提供了Coroutine機制,因為Coroutine可以大大簡化異步網(wǎng)絡(luò)程序的編寫,現(xiàn)在C++20中也要加入?yún)f(xié)程了(樂觀估計C++20加入,悲觀估計在C++23中加入)。

如果不用協(xié)程,寫一個異步的網(wǎng)絡(luò)程序是不那么容易的,以boost.asio的異步網(wǎng)絡(luò)編程為例,我們需要注意的地方很多,比如異步事件完成的回調(diào)函數(shù)中需要保證調(diào)用對象仍然存在,如何構(gòu)建異步回調(diào)鏈條等等,代碼比較復(fù)雜,而且出了問題也不容易調(diào)試。而協(xié)程給我們提供了對異步編程優(yōu)雅而高效的抽象,讓異步編程變得簡單!

C++ Courotines中增加了三個新的關(guān)鍵字:co_await,co_yield和co_return,如果一個函數(shù)體中有這三個關(guān)鍵字之一就變成Coroutine了。

co_await用來掛起和恢復(fù)一個協(xié)程,co_return用來返回協(xié)程的結(jié)果,co_yield返回一個值并且掛起協(xié)程。

下面來看看如何使用它們。

寫一個lazy sequence:

generatorget_integers(intstart=0,intstep=1){for(intcurrent=start;current+=step)co_yieldcurrent;}for(auton:get_integers(0,5)){std::cout<

上面的例子每次調(diào)用get_integers,只返回一個整數(shù),然后協(xié)程掛起,下次調(diào)用再返回一個整數(shù),因此這個序列不是即時生成的,而是延遲生成的。

接下來再看一下co_wait是如何簡化異步網(wǎng)絡(luò)程序的編寫的:

chardata[1024];for(;;){std::size_tn=co_awaitsocket.async_read_some(boost::asio::buffer(data),token);co_awaitasync_write(socket,boost::asio::buffer(data,n),token);}

這個例子僅僅用了四行代碼就完成了異步的echo,非常簡潔!co_await會在異步讀完成之前掛起協(xié)程,在異步完成之后恢復(fù)協(xié)程繼續(xù)執(zhí)行,執(zhí)行到async_write時又會掛起協(xié)程直到異步寫完成,異步寫完成之后繼續(xù)異步讀,如此循環(huán)。如果不用協(xié)程代碼會比較繁瑣,需要像這樣寫:

voiddo_read(){autoself(shared_from_this());socket_.async_read_some(boost::asio::buffer(data_,max_length),[this,self](boost::system::error_codeec,std::size_tlength){if(!ec){do_write(length);}});}voiddo_write(std::size_tlength){autoself(shared_from_this());boost::asio::async_write(socket_,boost::asio::buffer(data_,length),[this,self](boost::system::error_codeec,std::size_t/*length*/){if(!ec){do_read();}});}

可以看到,不使用協(xié)程來寫異步代碼的話,需要構(gòu)建異步的回調(diào)鏈,需要保持異步回調(diào)的安全性等等。而使用協(xié)程可以大大簡化異步網(wǎng)絡(luò)程序的編寫。

Reflection

C++中一直缺少反射功能,其他很多語言如Java、C#都具備運行期反射功能。反射可以用來做很多事情:比如做對象的序列化,把對象序列化為JSON、XML等格式,以及ORM中的實體映射,還有RPC遠程過程(方法)調(diào)用等,反射是應(yīng)用程序中非常需要的基礎(chǔ)功能。現(xiàn)在C++終于要提供反射功能了,C++20中可會將反射作為實驗庫,在C++23中正式加入到標(biāo)準(zhǔn)中。

在反射還沒有進入到C++標(biāo)準(zhǔn)之前,有很多人做了一些編譯期反射的庫,比如purecpp社區(qū)開源的序列化引擎iguana,以及ORM庫ormpp,都是基于編譯期反射實現(xiàn)的。然后,非語言層面支持的反射庫存在種種不足之處,比如在實現(xiàn)上需要大量使用模版元和宏、不能訪問私有成員等問題。

現(xiàn)在C++終于要提供完備地編譯期反射功能了,為什么是編譯期反射而不是像其它語言一樣提供運行期反射,因為C++的一個重要設(shè)計哲學(xué)就是zero-overhead,編譯期反射效率遠高于運行期反射。

那么,通過C++20的編譯期反射我們能得到什么呢?我們可以得到很多很多關(guān)于類型和對象的元信息,主要有:

獲取對象類型或枚舉類型的成員變量,成員函數(shù)的類型;

獲取類型和成員的名稱;

獲取成員變量是靜態(tài)的還是constexpr;

獲取方法是virtual、public、protect還是private;

獲取類型定義時的源代碼所在的行和列。

所以C++20的反射其實是提供了一些可以編譯期向編譯器查詢目標(biāo)類型“元數(shù)據(jù)”的API,下面來看看C++20的反射用法:

structperson{intid;std::stringname;};usingMetaPerson=reflexpr(person);usingMembers=std::reflect::get_data_members_t;usingMetax=std::reflect::get_data_members_t;constexprboolis_public=std::reflect::is_public_v;usingField0=std::reflect::get_reflected_type_t;//int

上面的例子中,C++20新增關(guān)鍵字reflexpr返回的是person的元數(shù)據(jù)類型,接下來我們就可以查詢這個元數(shù)據(jù)類型了,std::reflect::getdatamembers_t返回的是對象成員的元數(shù)據(jù)序列,我們可以像訪問tuple一樣訪問這個序列,得到某一個字段的元數(shù)據(jù)之后我們就可以獲取它的具體信息了,比如它的具體類型是什么,它的字段名是什么,它是公有還是私有的等等。

注意:C++20的反射語法還沒有最終確定,這只是一種候選的語法實現(xiàn),還有一種沒有元編程的語法版本,該版本通過編譯期容器和字符串來存放元數(shù)據(jù),比如constexpr std::vector,constexpr std::map,constexprstd::string等 ,這樣就可以像普通的C++程序那樣來操作元數(shù)據(jù)了,用起來可能更簡單。

C++20的編譯期反射實際上提供了一些編譯期查詢AST信息的接口,功能完備而強大。

總結(jié)

Concepts讓C++的模版程序的編寫變得更簡單和容易理解;

Ranges讓我們使用STL容器和算法更加簡單,并且更容易組合算法及延遲計算;

Modules幫助我們大大加快編譯速度,同時彌補了C++使用庫和缺乏包管理的缺陷;

Coroutines幫助我們簡化異步程序的編寫;

Reflection給我們提供強大的編譯期AST元數(shù)據(jù)查詢能力;

......

關(guān)于C++20的更多細節(jié)讀者可以在這里查看:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/。

總而言之,C++的新標(biāo)準(zhǔn)都是為了讓C++變得更簡單、更完善、更強大、更易學(xué)和使用,這也是C++之父希望未來C++演進的一個方向和目標(biāo)。

C++20,一言以蔽之:Newer is Better!

在此呼吁現(xiàn)在仍然還在使用著20年前的標(biāo)準(zhǔn)C++98的公司盡早升級到最新的標(biāo)準(zhǔn),跟上時代的發(fā)展,新標(biāo)準(zhǔn)意味這生產(chǎn)力和質(zhì)量的提升,越早使用越早享受其帶來的好處!

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

    關(guān)注

    88

    文章

    3671

    瀏覽量

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

    關(guān)注

    22

    文章

    2116

    瀏覽量

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

    關(guān)注

    30

    文章

    4879

    瀏覽量

    69975

原文標(biāo)題:C++20 準(zhǔn)備來了,看看都有哪些新特性?

文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C++20新特性解析

    C++之父都說過,C++20C++語言的一次重大變革,引入了大量的新特性。
    發(fā)表于 10-08 09:07 ?2220次閱讀

    新人報到來了

    新人報到來了。請大家多多指教。多多學(xué)習(xí)..呵
    發(fā)表于 07-13 13:09

    新人報到來了

    新人報到來了{:soso_e100:}
    發(fā)表于 07-21 17:42

    大家好,報到來了

    大家好,報到來了
    發(fā)表于 04-18 22:44

    經(jīng)過一定時間將數(shù)組中的值置0

    `我來了,大佬們 我一開始要給那兩個子vi 數(shù)組里分別放上100 200 300 400的值,但是過10s或者時間可以自己設(shè)定后 讓
    發(fā)表于 08-17 22:24

    STM32CubeIDE不支持C++20語法嗎?

    我正在使用 STM32CubeIDE 編寫 C++ 代碼。IDE 的版本是 1.11.0,它帶有 arm-none-eabi-g++ 版本 10.3-2021.10。編譯器具有一些 C++20 功能
    發(fā)表于 02-02 06:51

    c++標(biāo)準(zhǔn)庫手冊

    C++標(biāo)準(zhǔn)庫手冊,新手學(xué)習(xí)的好資料,同時也是開發(fā)人員的必備手冊。里面涵蓋了標(biāo)準(zhǔn)C++的所有的庫函數(shù)。
    發(fā)表于 11-03 14:05 ?43次下載

    2020年底將正式發(fā)布C++20

    9月4日,C++ 20的國際標(biāo)準(zhǔn)草案投票結(jié)束,而且獲得了全票通過。這意味著C++ 20已完成最終的技術(shù)審批,并已完成ISO投票,我們希望在完
    的頭像 發(fā)表于 09-22 14:28 ?3197次閱讀

    關(guān)于C++ 20協(xié)程最全面詳解

    花了一兩周的時間后,我想寫寫 C++20 協(xié)程的基本用法,因為 C++ 的協(xié)程讓我感到很奇怪,寫一個協(xié)程程序十分費勁。讓我們拋去復(fù)雜的東西,來看看寫一個 C++ 協(xié)程需要哪些東西。
    的頭像 發(fā)表于 04-12 11:10 ?1.3w次閱讀
    關(guān)于<b class='flag-5'>C++</b> <b class='flag-5'>20</b>協(xié)程最全面詳解

    蘋果iPhone因宣傳被告了

    蘋果被告了。 這次上熱搜的功能,所有型號的 iPhone 都有可能中招,所以大家一定要重視起來! 還記得 iPhone 12 系列發(fā)布之后,蘋果為了宣傳自家手機的耐用性,特意拍
    的頭像 發(fā)表于 04-29 15:15 ?1534次閱讀

    現(xiàn)代C++20實戰(zhàn)手冊

    追其根源,C++ 為何如此受歡迎,除了它本身出色的性能,作為一種高級面向?qū)ο笳Z言,適用領(lǐng)域極其廣泛,小到嵌入式,大到分布式服務(wù)器,到處可以見到 C++ 的身影;另一個很重要的原因就是它“最近”不斷發(fā)布具有有趣功能的新語言標(biāo)準(zhǔn),也
    的頭像 發(fā)表于 01-17 09:55 ?3677次閱讀

    C++20 modules入門

    以前一直有了解C++20的新特性,但是因為編譯器對此支持的比較少,所以很少實踐。
    的頭像 發(fā)表于 05-29 15:03 ?1171次閱讀
    <b class='flag-5'>C++20</b> modules入門

    C++20 modules基礎(chǔ)知識入門

    以前一直有了解C++20的新特性,但是因為編譯器對此支持的比較少,所以很少實踐。
    的頭像 發(fā)表于 06-15 11:37 ?1084次閱讀
    <b class='flag-5'>C++20</b> modules基礎(chǔ)知識入門

    C++20無棧協(xié)程超輕量高性能異步庫開發(fā)實戰(zhàn)

    來了c++標(biāo)準(zhǔn)委員會的謹慎態(tài)度也造就了c++20的給出來協(xié)程:“性能之優(yōu)秀”,“開發(fā)之靈活”和讓人勸退的“門檻之高”。 不過話說回來,c++
    的頭像 發(fā)表于 11-09 10:20 ?1798次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個版本,來了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuke
    的頭像 發(fā)表于 01-11 09:00 ?839次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: 日本网站免费 | 91中文字幕视频 | 久久国产乱子伦精品免费强 | 天天做天天干 | 久久99国产精品久久99 | 天天躁夜夜躁狠狠躁躁88 | 亚洲国产精品自在现线让你爽 | 怡红院亚洲怡红院首页 | 午夜免费福利影院 | 欧美性色xo影院永久禁欲 | 日本人69xxxxx | 亚洲 欧美 日韩 综合 | 国产成人精品日本 | 黄色大片在线免费观看 | 激情深爱 | 成人看的一级毛片 | 日本在线视频www色 日本在线视频精品 | 99久久99久久久精品齐齐鬼色 | 国产日韩精品一区二区三区 | 在线播放视频网站 | 午夜视频免费 | 色妞女女女女女bbbb | 欧美成人性色生活片天天看 | 丁香狠狠色婷婷久久综合 | 久久综合色区 | 国产精品久久久久久一级毛片 | 日韩免费视频一区二区 | 午夜美女久久久久爽久久 | 91精品啪国产在线观看免费牛牛 | 91在线播放免费不卡无毒 | 久久精品香蕉视频 | 成人欧美精品一区二区不卡 | 国内精品视频 | 美女牲交视频一级毛片 | 波多野结衣一级特黄毛片 | 免费一级在线观看 | 天堂最新在线资源 | 成人自拍视频 | 国产亚洲精品线观看77 | 永久免费影视在线观看 | 国产精品夜色一区二区三区 |