C ++ Russia: kwenzeka njani

Ukuba ekuqaleni komdlalo uthi kukho ikhowudi ye-C ++ exhonywe eludongeni, ngoko ke ekugqibeleni ibophelelekile ukuba ikudubule enyaweni.

Bjarne Stroustrup

Ukususela ngo-Oktobha 31 ukuya kuNovemba 1, inkomfa yeC ++ yaseRussia Piter yabanjwa eSt. Izithethi zeendwendwe ziquka amalungu eKomiti yeMigangatho ye-C ++, izithethi zeCppCon, ababhali bencwadi ye-O'Reilly, kunye nabagcini beeprojekthi ezifana ne-LLVM, i-libc ++, kunye ne-Boost. Inkomfa ijolise kubaphuhlisi abanamava beC ++ abafuna ukujula ubuchule babo kunye namava otshintshiselwano kunxibelelwano oluphilayo. Abafundi, abafundi abanezidanga kunye nootitshala baseyunivesithi babonelelwa ngezaphulelo ezintle kakhulu.

Uhlelo lwaseMoscow lwenkomfa luya kufumaneka ukuba lutyelelwe kwasekuqaleni kuka-Epreli wonyaka ozayo, kodwa okwangoku abafundi bethu baya kukuxelela izinto ezinomdla abazifundileyo kwisiganeko sokugqibela. 

C ++ Russia: kwenzeka njani

Ifoto evela icwecwe lenkomfa

Ngathi

Abafundi ababini abavela kwiYunivesithi yoPhando lweSizwe kwiSikolo esiPhakamileyo sezoQoqosho - iSt. Petersburg basebenze kwesi sithuba:

  • ULiza Vasilenko ngumfundi wesine ofunda isidanga sokuqala kwiiLwimi njengenxalenye yeNkqubo yeMathematika eSetyenzisiweyo kunye neNzululwazi yeKhompyutha. Emva kokuqhelana nolwimi lwe-C++ kunyaka wam wokuqala eyunivesithi, emva koko ndafumana amava okusebenza nalo ngokuqeqeshelwa umsebenzi kolu shishino. Umdla wokucwangcisa iilwimi ngokubanzi kunye nenkqubo esebenzayo ngokukodwa ushiye uphawu ekukhethweni kweengxelo kwinkomfa.
  • UDanya Smirnov ungumfundi we-1 wonyaka weprogram ye-master "Ukucwangcisa iNkqubo kunye nokuHlalutya kweDatha". Ngethuba ndisesikolweni, ndabhala iingxaki ze-Olympiad kwi-C ++, kwaye kwenzeka ngandlela-thile ukuba ulwimi luhlala luvela kwimisebenzi yemfundo kwaye ekugqibeleni lwaba lulwimi olusebenzayo. Ndithathe isigqibo sokuthatha inxaxheba kwinkomfa ukuze ndiphucule ulwazi lwam kwaye ndifunde nangamathuba amatsha.

Kwincwadana yeendaba, ubunkokeli befakhalthi bahlala besabelana ngolwazi malunga neziganeko zemfundo ezinxulumene nobungcali bethu. NgoSeptemba sabona ulwazi malunga neC ++ yaseRashiya kwaye sagqiba ukubhalisa njengabaphulaphuli. La ngamava ethu okuqala okuthatha inxaxheba kwiinkomfa ezinjalo.

Isakhiwo senkomfa

  • Iingxelo

Kwisithuba seentsuku ezimbini, iingcali zifunde iingxelo ezingama-30, ezigubungela izihloko ezininzi ezishushu: ukusetyenziswa ngobuchule kweempawu zolwimi ukusombulula iingxaki ezisetyenzisiweyo, uhlaziyo lweelwimi oluzayo ngokunxulumene nomgangatho omtsha, ukuthomalalisa kuyilo lweC ++ kunye nezilumkiso xa usebenza neziphumo zabo, imizekelo. yoyilo lweprojekthi olunika umdla, kunye neenkcukacha eziphantsi kwesiseko seziseko zolwimi. Imiboniso emithathu yenzeke ngaxeshanye, amaxesha amaninzi ibe mibini ngesiRashiya nomnye ngesiNgesi.

  • Iindawo zengxoxo

Emva kwentetho, yonke imibuzo engaphendulwanga kunye neengxoxo ezingagqitywanga zidluliselwe kwiindawo ezikhethiweyo ezikhethekileyo zokunxibelelana nezithethi, ezixhotyiswe ngeebhodi zokumakisha. Indlela elungileyo ngelixa kude ikhefu phakathi kweentetho ngencoko emnandi.

  • IiNtetho zombane kunye neengxoxo ezingekho sikweni

Ukuba ufuna ukunika ingxelo emfutshane, ungabhalisa kwi-whiteboard kwiNtetho yoMbane yangokuhlwa kwaye ufumane imizuzu emihlanu yexesha lokuthetha malunga nantoni na kwisihloko senkomfa. Umzekelo, intshayelelo ekhawulezayo kwizicoci zeC++ (kwabanye ibintsha) okanye ibali malunga negciwane kwisizukulwana samaza esinevayo elinokuviwa kuphela, kodwa lingabonwa.

Enye indlela yingxubusho yeqela elithi “IKomiti Ngentliziyo Esuka Intliziyo.” Kwiqonga kukho amalungu athile ekomiti yokulinganisa, kwiprojekti yindawo yomlilo (ngokusemthethweni - ukudala umoya onyanisekileyo, kodwa isizathu "kuba yonke into iphelile" ibonakala ihlekisayo), imibuzo malunga nomgangatho kunye nombono jikelele weC ++ , ngaphandle kweengxoxo zobugcisa ezivuthayo kunye ne-holiwars. Kwafumaniseka ukuba le komiti ikwaqulathe abantu abaphilayo abangaqinisekanga ngokupheleleyo ngento ethile okanye abangazi nto.

Kubalandeli beeholide, isiganeko sesithathu sahlala kwimeko - iseshoni ye-BOF "Hamba vs. C ++". Sithatha umthandi we-Go, umthandi we-C ++, ngaphambi kokuqala kweseshoni balungiselela kunye izilayidi eziyi-100500 ngesihloko (njengeengxaki ngeepakethe kwi-C ++ okanye ukungabikho kweegenerics kwi-Go), kwaye ke banengxoxo ephilileyo phakathi kwabo kwaye kunye nabaphulaphuli, kwaye abaphulaphuli bazama ukuqonda iimbono ezimbini ngaxeshanye . Ukuba i-holivar iqala ngaphandle komxholo, imodareyitha iyangenelela kwaye ixolelanise amaqela. Le fomati iyalutha: iiyure ezininzi emva kokuqala, kuphela isiqingatha sezilayidi ezigqityiweyo. Isiphelo kwakufuneka sikhawuleziswe kakhulu.

  • Iqabane limile

Amaqabane ale nkomfa ayemelwe kwiiholo - kwiindawo zokungcebeleka athetha ngeeprojekthi zangoku, anikezela ngee-internship kunye nengqesho, abamba iikhwizi kunye nokhuphiswano oluncinci, kwaye baphinda bahlutha amabhaso amahle. Kwangaxeshanye, ezinye iinkampani zade zanikezela ukuba zidlule kwizigaba zokuqala zodliwano-ndlebe, ezinokuba luncedo kwabo bezayo kungekuphela nje ukuphulaphula iingxelo.

Iinkcukacha zobugcisa zeengxelo

Simamele iingxelo ngazo zombini ezi ntsuku. Ngamanye amaxesha kwakuba nzima ukukhetha ingxelo enye kwezi zihambelanayo - savumelana ukuba sohlukane kwaye sitshintshiselane ngolwazi esilufumene ngexesha lekhefu. Kwaye nangona kunjalo, kubonakala ngathi kuninzi okushiyekileyo. Apha singathanda ukuthetha ngemixholo yezinye iingxelo esizifumene zinomdla kakhulu

Ngaphandle kwe-C ++ ngokusebenzisa i-prism yokulungelelaniswa komqokeleli, u-Roman Rusyaev

C ++ Russia: kwenzeka njani
Slayida ukusuka iintetho

Njengoko isihloko sicebisa, uRoman wajonga ukusebenza ngaphandle kokusebenzisa i-LLVM njengomzekelo. Kwangaxeshanye, kwabo bangayisebenzisiyo iClang emsebenzini wabo, ingxelo isenokuthi inike umbono wokuba ikhowudi inokwenziwa njani na. Oku kungenxa yokuba abaphuhlisi babaqulunqi kunye namathala eencwadi ahambelanayo anxibelelana kunye kwaye izisombululo ezininzi eziyimpumelelo zinokudibana.

Ngoko ke, ukusingatha ngaphandle, kufuneka wenze izinto ezininzi: biza ikhowudi yokuphatha (ukuba ikhona) okanye izixhobo zamahhala kwinqanaba langoku kwaye ujikeleze isitaki phezulu. Konke oku kukhokelela kwinto yokuba umqambi wongeza imiyalelo eyongezelelweyo yeefowuni ezinokuphosa ngaphandle. Ke ngoko, ukuba okuchaseneyo akuphakanyiswanga ngokwenyani, inkqubo isaza kwenza izenzo ezingeyomfuneko. Ukuze ngandlela ithile kuncitshiswe i-overhead, i-LLVM inee-heuristics ezininzi zokumisela iimeko apho ikhowudi yokuphatha yangaphandle kungafuneki ukuba yongezwe okanye inani lemiyalelo "eyongezelelweyo" inokuncitshiswa.

Isithethi sivavanya malunga neshumi elinesibini kubo kwaye sibonisa zombini iimeko apho banceda ukukhawulezisa ukuphunyezwa kweprogram, kunye nezo apho ezi ndlela zingasebenzi.

Ke, uRoman Rusyaev ukhokelela abafundi kwisigqibo sokuba ikhowudi equlathe ukuphathwa ngokungafaniyo ayinakuhlala isenziwa nge-zero, kwaye inika iingcebiso ezilandelayo:

  • xa uphuhlisa amathala eencwadi, kufanelekile ukulahla izinto ezingaqhelekanga ngokwemigaqo;
  • ukuba izinto ezingaphandle zisafuneka, ngoko nanini na kuyenzeka kufanelekile ukongeza ngaphandle (kwaye const) izilungisi kuyo yonke indawo ukuze umqokeleli akwazi ukukhulisa kangangoko kunokwenzeka.

Ngokubanzi, isithethi siqinisekisile imbono yokuba ngaphandle kokusetyenziswa ngokufanelekileyo kubuncinci okanye kushiywe ngokupheleleyo.

Izilayidi zengxelo ziyafumaneka kwikhonkco elilandelayo: [“Izinto ezingaphandle kwe-C++ ngelensi yolungelelaniso lomqokeleli we-LLVM”]

Iijenereyitha, ii-coroutines kunye nobunye ubumnandi obuvula ingqondo, uAdi Shavit

C ++ Russia: kwenzeka njani
Slayida ukusuka iintetho

Enye yeengxelo ezininzi kule nkomfa ezinikezelwe kwizinto ezintsha kwi-C ++ 20 yayingalibaleki kuphela ngokubonisa kwayo okumibalabala, kodwa kunye nokuchongwa kwayo ngokucacileyo kweengxaki ezikhoyo kunye nengqiqo yokucubungula ukuqokelela (i-loop, i-callbacks).

I-Adi Shavit ibalaselisa oku kulandelayo: iindlela ezikhoyo ngoku zihamba ngengqokelela yonke kwaye azinikezeli ukufikelela kwimo ethile yangaphakathi ephakathi (okanye zenza kwimeko yokufowuna, kodwa ngenani elikhulu leziphumo ebezingalindelekanga ezingemnandi, njengeCallback Hell) . Kubonakala ngathi kukho abaphindaphindayo, kodwa kunye nabo yonke into ayihambanga kakuhle: akukho manqaku aqhelekileyo okungena kunye nokuphuma (qala → ukuphela ngokuchasene ne-rbegin → ukurenta njalo njalo), akucaci ukuba siya kuphinda ixesha elingakanani? Ukuqala nge-C++20, ezi ngxaki zisonjululwe!

Inketho yokuqala: uluhlu. Ngokusonga ii-iterators, sifumana ujongano oluqhelekileyo lwesiqalo kunye nesiphelo sophindaphindo, kwaye sikwafumana isakhono sokuqamba. Konke oku kwenza kube lula ukwakha imibhobho yokucubungula idatha epheleleyo. Kodwa akusiyo yonke into egudileyo: inxalenye yengqiqo yokubala ibekwe ngaphakathi kokuphunyezwa kwe-iterator ethile, enokuthi idibanise ikhowudi ukuqonda kunye nokulungisa.

C ++ Russia: kwenzeka njani
Slayida ukusuka iintetho

Ewe, kule meko, i-C ++20 yongezwa ii-coroutines (imisebenzi eziphatha ngendlela efana neejeneretha kwi-Python): ukubulawa kunokuhlehliswa ngokubuyisela ixabiso langoku ngelixa ugcina imeko ephakathi. Ke, asifezekisi kuphela ukusebenza ngedatha njengoko ibonakala, kodwa sikwafaka yonke ingqiqo ngaphakathi kwi-coroutine ethile.

Kodwa kukho impukane kwi-ointment: okwangoku baxhaswa kuphela ngabaqulunqi abakhoyo, kwaye abaphunyezwanga ngokucokisekileyo njengoko singathanda: umzekelo, akukafaneleki ukusebenzisa izikhombisi kunye nezinto zesikhashana kwii-coroutines. Ngaphezu koko, kukho izithintelo kwizinto ezinokuthi zibe yi-coroutines, kunye nemisebenzi ye-constexpr, abakhi / ababhubhisi, kunye neyona nto iphambili ayifakiwe kuloluhlu.

Ngaloo ndlela, ii-coroutines zixazulula inxalenye ebalulekileyo yeengxaki kunye nokulula kwengqiqo yokucubungula idatha, kodwa ukuphunyezwa kwazo kwangoku kufuna ukuphuculwa.

Izinto:

C ++ tricks ukusuka Yandex.Taxi, Anton Polukhin

Kwimisebenzi yam yobuchwephesha, ngamanye amaxesha kuye kufuneke ndiphumeze izinto ezincedisayo: isisongelo phakathi kojongano lwangaphakathi kunye neAPI yethala leencwadi elithile, ukugawulwa okanye ukwahlulahlula. Kule meko, akukho mfuneko yokuba naluphi na ulungiselelo olongezelelweyo. Kodwa kuthekani ukuba la macandelo asetyenziswa kwezinye zeenkonzo ezidumileyo kwiRuNet? Kwimeko enjalo, kuya kufuneka usebenze i-terabytes ngeyure yezigodo kuphela! Emva koko yonke i-millisecond ibala kwaye ngoko kufuneka ubhenele kumaqhinga ahlukeneyo - u-Anton Polukhin wathetha ngabo.

Mhlawumbi owona mzekelo unomdla wawukukuphunyezwa kwepatheni ye-pointer-to-implementation (pimpl). 

#include <third_party/json.hpp> //PROBLEMS! 
struct Value { 
    Value() = default; 
    Value(Value&& other) = default; 
    Value& operator=(Value&& other) = default; 
    ~Value() = default; 

    std::size_t Size() const { return data_.size(); } 

private: 
    third_party::Json data_; 
};

Kulo mzekelo, okokuqala ndifuna ukulahla iifayile zentloko zamathala eencwadi angaphandle - oku kuya kuhlanganisa ngokukhawuleza, kwaye unokuzikhusela kwiingxabano zamagama ezinokwenzeka kunye nezinye iimpazamo ezifanayo. 

Kulungile, siye sahambisa # bandakanya kwifayile ye.cpp: sifuna isibhengezo esingaphambili se-API esongelweyo, kunye ne-std::unique_ptr. Ngoku sinolwabiwo oluguquguqukayo kunye nezinye izinto ezingathandekiyo njengedatha esasazwe kwinqwaba yedatha kunye neziqinisekiso ezincitshisiweyo. std::aligned_storage inganceda kuyo yonke lento. 

struct Value { 
// ... 
private: 
    using JsonNative = third_party::Json; 
    const JsonNative* Ptr() const noexcept; 
    JsonNative* Ptr() noexcept; 

    constexpr std::size_t kImplSize = 32; 
    constexpr std::size_t kImplAlign = 8; 
    std::aligned_storage_t<kImplSize, kImplAlign> data_; 
};

Ingxaki kuphela: kufuneka sicacise ubungakanani kunye nolungelelwaniso lwesonga ngalinye - masenze itemplate yethu yepimpl ngeeparamitha , sebenzisa amaxabiso angenasizathu kwaye songeze itshekhi kumtshabalalisi esiqikelele ukuba yonke into ilungile. : 

~FastPimpl() noexcept { 
    validate<sizeof(T), alignof(T)>(); 
    Ptr()->~T(); 
}

template <std::size_t ActualSize, std::size_t ActualAlignment>
static void validate() noexcept { 
    static_assert(
        Size == ActualSize, 
        "Size and sizeof(T) mismatch"
    ); 
    static_assert(
        Alignment == ActualAlignment, 
        "Alignment and alignof(T) mismatch"
    ); 
}

Kuba i-T sele ichaziwe xa kusenziwa umtshabalalisi, le khowudi iya kucazululwa ngokuchanekileyo kwaye kwinqanaba lokudibanisa iya kukhupha ubungakanani obufunekayo kunye namaxabiso olungelelwaniso ekufuneka afakwe njengeempazamo. Ngaloo ndlela, ngeendleko zokwenziwa kokuhlanganiswa okongeziweyo, silahla ulwabiwo oluguquguqukayo lweeklasi ezisongelweyo, sifihle i-API kwifayile ye-cpp kunye nokuphunyezwa, kwaye sifumane noyilo olufanelekileyo ngakumbi kwi-caching yiprosesa.

Ukugawulwa kwemithi kunye nokwahlulahlula kubonakala kungathandeki kwaye ke akusayi kukhankanywa kolu hlaziyo.

Izilayidi zengxelo ziyafumaneka kwikhonkco elilandelayo: ["C++ amaqhinga asuka eteksini"]

Iindlela zanamhlanje zokugcina ikhowudi yakho DRY, Björn Fahller

Kule ntetho, uBjörn Fahller ubonisa iindlela ezininzi ezahlukeneyo zokulwa nesiphene sesitayile sokujonga imeko ephindaphindiweyo:

assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);

Ivakala iqhelekile? Ngokusebenzisa ubuchule obunamandla be-C++ obuziswe kwimigangatho yamva nje, unokuphumeza ngobuchule ukusebenza okufanayo ngaphandle kwesohlwayo sokusebenza. Thelekisa:   

assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));

Ukuphatha inani elingaqingqwanga lokutshekishwa, ngokukhawuleza kufuneka usebenzise itemplates ezahlukahlukeneyo kwaye ugobe amabinzana. Masicinge ukuba sifuna ukujonga ukulingana kwezinto ezininzi kwi-enum's state_type element. Into yokuqala ethi qatha engqondweni kukubhala umsebenzi womncedi ngu_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

template <typename ... Ts>
bool is_any_of(state_type s, const Ts& ... ts) { 
    return ((s == ts) || ...); 
}

Esi siphumo esiphakathi siyadanisa. Ukuza kuthi ga ngoku ikhowudi ayifundeki ngakumbi:

assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED)); 

Iiparamitha zetemplate ezingezona uhlobo ziya kunceda ukuphucula imeko kancinane. Ngoncedo lwabo, siya kudlulisela izinto ezinokubalwa ze-enum kuluhlu lweeparamitha zetemplate: 

template <state_type ... states>
bool is_any_of(state_type t) { 
    return ((t == states) | ...); 
}
	
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state)); 

Ngokusebenzisa i-auto kwiparameter yetemplate engeyiyo yodidi (C++17), indlela yokwenza ngokulula idibanisa uthelekiso kungekuphela nje ngezinto ze-state_type, kodwa kunye neentlobo zamandulo ezinokusetyenziswa njengeeparamitha zetemplate ezingezohlobo:


template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
    return ((t == alternatives) | ...);
}

Ngolu phuculo lulandelelanayo, isivakalisi esinqwenelekayo sokuhlolwa siyafezekiswa:


template <class ... Ts>
struct any_of : private std::tuple<Ts ...> { 
// поленимся и унаследуем конструкторы от tuple 
        using std::tuple<Ts ...>::tuple;
        template <typename T>
        bool operator ==(const T& t) const {
                return std::apply(
                        [&t](const auto& ... ts) {
                                return ((ts == t) || ...);
                        },
                        static_cast<const std::tuple<Ts ...>&>(*this));
        }
};

template <class ... Ts>
any_of(Ts ...) -> any_of<Ts ... >;
 
assert(any_of(IDLE, DISCONNECTING, DISCONNECTED) == state);

Kulo mzekelo, isikhokelo sokutsalwa sisebenza ekucebiseni iiparamitha zetemplate yesakhiwo esifunwayo kumqambi, owaziyo iintlobo zeengxabano zomakhi. 

Ngaphezulu - ngakumbi umdla. I-Bjorn ifundisa indlela yokwenza ngokubanzi ikhowudi yesiphumo yabaqhubi bothelekiso ngaphaya ==, kunye nemisebenzi engafanelekanga. Endleleni, iimpawu ezifana ne-no_unique_address attribute (C ++20) kunye neeparameters zetemplate kwimisebenzi ye-lambda (C ++20) zichazwe kusetyenziswa imizekelo yokusetyenziswa. (Ewe, ngoku i-lambda syntax ilula ngakumbi ukuyikhumbula - ezi zizibini ezine ezilandelelanayo zeeparentheses zazo zonke iintlobo.) Isisombululo sokugqibela sisebenzisa imisebenzi njengeenkcukacha zomakhi ziyawufudumeza umphefumlo wam, singasathethi ke ngentetha ye-tuple kwezona zithethe ze-lambda. icalculus.

Ekugqibeleni, ungalibali ukuyipholisha:

  • Khumbula ukuba lambdas constexpr simahla; 
  • Makhe songeze ugqithiso olugqibeleleyo kwaye sijonge kwi-syntax yayo embi ngokunxulumene nepakethe yeparamitha kukuvalwa kwe-lambda;
  • Masinike umqokeleli amathuba angakumbi okulungelelaniswa nemeko ethile ngaphandle; 
  • Masithathele ingqalelo ngakumbi isiphumo sempazamo esiqondakalayo kwiitemplates enkosi kumaxabiso embuyekezo acacileyo e-lambdas. Oku kuya kunyanzela umqokeleli ukuba enze iitshekhi ezingaphezulu phambi kokuba umsebenzi wetemplate ubizwe ngokwenyani - kwinqanaba lokujonga uhlobo. 

Ngeenkcukacha, nceda ubhekisele kwizixhobo zokufunda: 

Imibono yethu

Inxaxheba yethu yokuqala kwi-C ++ yaseRashiya yayikhumbuleka ngamandla ayo. Ndifumene ingcamango yeC ++ yaseRashiya njengesiganeko esinyanisekileyo, apho umgca phakathi koqeqesho kunye nonxibelelwano oluphilayo luphantse lungabonakali. Yonke into, ukusuka kwimo yesithethi ukuya kukhuphiswano oluvela kumaqabane omsitho, ilungele iingxoxo ezishushu. Umxholo wenkomfa, oquka iingxelo, uquka uluhlu olubanzi ngokufanelekileyo lwezihloko ezibandakanya izinto ezintsha ze-C ++, izifundo zeeprojekthi ezinkulu kunye neengcamango zoyilo lwe-architectural. Kodwa kuya kuba yinto engafanelekanga ukungayihoyi icandelo lentlalontle lomcimbi, onceda ukunqoba imiqobo yolwimi ngokumalunga neC ++ kuphela.

Sibulela abaququzeleli benkomfa ngethuba lokuthatha inxaxheba kumsitho onje!
Usenokuba usibonile isithuba sabaququzeleli malunga nexesha elidlulileyo, langoku kunye nekamva leC ++ yaseRashiya kwiblogi yeJUG Ru.

Enkosi ngokufunda, kwaye sinethemba lokuba ukubalisa kwakhona ngeziganeko kube luncedo!

umthombo: www.habr.com

Yongeza izimvo