C ++ Russia: zvakaitika sei

Kana pakutanga kwemutambo iwe unoti pane C ++ code yakaturikwa pamadziro, zvino pakuguma inosungirwa kukupfura mutsoka.

Bjarne Stroustrup

Kubva munaOctober 31 kusvika kuNovember 1, musangano weC ++ weRussia Piter wakaitirwa muSt. Vatauri vakakokwa vanosanganisira nhengo dzeC++ Standards Committee, vatauri veCppCon, O'Reilly vanyori vemabhuku, uye vagadziri vezvirongwa zvakaita seLLVM, libc++, uye Boost. Musangano uyu wakanangana nevagadziri veC++ vane ruzivo vanoda kudzamisa hunyanzvi hwavo uye kuchinjanisa zviitiko mukutaurirana kwepamoyo. Vadzidzi, vadzidzi vakapedza kudzidza uye vadzidzisi vekuyunivhesiti vanopihwa zvidzoreso zvakanaka kwazvo.

Shanduro yeMoscow yemusangano ichave iripo kuti ishanyire kutanga kwaApril gore rinouya, asi panguva ino vadzidzi vedu vachakuudza zvinhu zvinonakidza zvavakadzidza pachiitiko chekupedzisira. 

C ++ Russia: zvakaitika sei

Mufananidzo kubva album album

Nezvedu

Vadzidzi vaviri kubva kuNational Research University Higher School of Economics - St. Petersburg vakashanda pane iyi positi:

  • Liza Vasilenko igore rechina undergraduate mudzidzi achidzidza Programming Mitauro sechikamu cheApplied Mathematics uye Computer Science chirongwa. Sezvo ndave kuziva mutauro weC ++ mugore rangu rokutanga kuyunivhesiti, ndakazowana ruzivo rwekushanda nawo kuburikidza nekudzidzira mumhizha. Chishuwo changu chekuronga mitauro mune zvese uye inoshanda hurongwa kunyanya yakasiya mucherechedzo wayo pakusarudzwa kwemishumo pamusangano.
  • Danya Smirnov ari 1st gore mudzidzi wepurogiramu yatenzi "Programming uye Data Analysis". Ndichiri kuchikoro, ndakanyora matambudziko eOlympiad muC ++, uye zvakazoitika neimwe nzira kuti mutauro waigara uchiuya mumabasa ekudzidzisa uye pakupedzisira wakazova mutauro mukuru wekushanda. Ndakasarudza kutora chikamu mumusangano kuti ndivandudze ruzivo rwangu uye kudzidzawo nezvemikana mitsva.

Mutsamba yenhau, hutungamiriri hwefizikisi hunowanzo kugovera ruzivo nezvezviitiko zvedzidzo zvine chekuita nehunyanzvi hwedu. MunaSeptember takaona ruzivo pamusoro peC ++ Russia uye takasarudza kunyoresa sevateereri. Ichi ndicho chiitiko chedu chekutanga kutora chikamu mumisangano yakadai.

Chimiro chemusangano

  • Reports

Mukufamba kwemazuva maviri, nyanzvi dzakaverenga mishumo makumi matatu, ichivhara nyaya dzakawanda dzinopisa: hungwaru hwekushandisa kwemitauro kugadzirisa matambudziko akaiswa, mitauro iri kuuya inogadziridza maererano neiyo chiyero chitsva, kukanganisa muC ++ dhizaini uye yekungwarira pakushanda nemhedzisiro yavo, mienzaniso. yezvivakwa zvinofadza zvepurojekiti, pamwe chete nezvimwe zviri pasi-the-hood zvinyorwa zvemutauro wekugadzira. Zviitwa zvitatu zvakaitika panguva imwe chete, kazhinji kaviri muchiRussia uye chimwe muchiRungu.

  • Nzvimbo dzekukurukurirana

Mushure mekutaura, mibvunzo yese isina kubvunzwa uye nhaurirano dzisina kupera dzakaendeswa kunzvimbo dzakatarwa dzekutaurirana nevatauri, vakashongedzerwa nemabhodhi emaka. Nzira yakanaka yekuenda kure nekuzorora pakati pekutaura nehurukuro inonakidza.

  • Hurukuro dzeMheni uye nhaurirano dzisina kurongwa

Kana muchida kupa mushumo mupfupi, munokwanisa kusaina pabhodhi chena yeHurukuro yeMheni yemanheru uye wowana maminetsi mashanu enguva yekutaura pamusoro pechinhu chipi nechipi pamusoro pehurukuro yemusangano. Semuyenzaniso, sumo yekukurumidza kune sanitizer yeC++ (kune vamwe yanga iri nyowani) kana nyaya nezve bug in sine wave generation inongonzwika, asi isingaonekwe.

Imwe nzira ikurukurirano yeboka β€œNeDare Rinoda Kusvika Pamwoyo.” Pachikuva pane dzimwe nhengo dzekomiti yekuenzanisa, pane purojekita inzvimbo yemoto (zviri pamutemo - kugadzira mamiriro echokwadi, asi chikonzero "nekuti ZVINHU ZVOSE ZVIRI PAMOTO" zvinoita sekusekesa), mibvunzo pamusoro pechiyero uye chiono cheC ++ , pasina kupisa kwehunyanzvi hurukuro uye holiwars. Zvakazoitika kuti komiti iyi inewo vanhu vapenyu vangave vasina chokwadi chechimwe chinhu kana kuti vangave vasina chavanoziva.

Kune vateveri veholivars, chiitiko chechitatu chakaramba chiri pachiitiko - chikamu cheBOF "Go vs. C ++". Isu tinotora Go mudiwa, C ++ anoda, isati yatanga chikamu ivo pamwe chete vanogadzirira 100500 masiraidhi pamusoro wenyaya (senge matambudziko nemapakeji muC ++ kana kushomeka kwemageneric muGo), vobva vaita nhaurirano ine moyo pakati pavo uye nevateereri, uye vateereri vanoedza kunzwisisa pfungwa mbiri panguva imwe chete . Kana holivar ikatanga kunze kwemamiriro ezvinhu, mutongi anopindira uye anoyananisa mapato. Iyi fomati inopindwa muropa: maawa akati wandei mushure mekutanga, hafu chete yemasiraidhi yakapedzwa. Mugumo waifanira kukurumidziswa zvikuru.

  • Shamwari inomira

Vadyidzani vemusangano uyu vakamiririrwa muhoro - pamasitendi vakataura nezve mapurojekiti azvino, vakapa mainternship uye basa, vakaita mibvunzo uye makwikwi madiki, uye zvakare vakahwina mibairo yakanaka. Panguva imwecheteyo, mamwe makambani akatozvipira kuti apinde mumatanho ekutanga ekubvunzurudza, izvo zvinogona kubatsira kune avo vakauya kwete kungoteerera mishumo.

Unyanzvi hweruzivo rwemishumo

Takateerera mishumo mazuva ose ari maviri. Dzimwe nguva zvanga zvakaoma kusarudza rondedzero imwe chete kubva kune dzakafanana - takabvumirana kupatsanurana uye kupanana ruzivo rwatakawana panguva yekuzorora. Uye kunyange zvakadaro, zvinoratidzika kuti zvakawanda zvakasiiwa. Pano tinoda kutaura pamusoro pezviri mukati memimwe mishumo yatakawana inofadza zvikuru

Kunze kweC ++ kuburikidza neprism ye compiler optimizations, Roman Rusyaev

C ++ Russia: zvakaitika sei
Slide kubva mharidzo

Sezvinoratidzwa nemusoro, Roman akatarisa kushanda kunze kwekushandisa LLVM semuenzaniso. Panguva imwecheteyo, kune avo vasingashandise Clang mubasa ravo, chirevo chinogona kuramba chichipa imwe pfungwa yekuti iyo kodhi inogona kuvandudzwa sei. Izvi zvinodaro nekuti vagadziri vevagadziri uye anoenderana akajaibhurari anotaurirana uye akawanda akabudirira mhinduro anogona kuenderana.

Saka, kubata kusarudzika, iwe unofanirwa kuita zvinhu zvakawanda: fonera iyo yekubata kodhi (kana iripo) kana yemahara zviwanikwa pane yazvino nhanho uye kupepeta kumusoro kumusoro. Zvese izvi zvinotungamira kune chokwadi chekuti mugadziri anowedzera mimwe mirairo yekufona iyo inogona kukanda kunze. Naizvozvo, kana iyo yakasarudzika isina kunyatsosimudzwa, chirongwa chicharamba chichiita zviito zvisina basa. Kuti neimwe nzira ideredze pamusoro, LLVM ine akati wandei heuristics yekuona mamiriro ezvinhu apo kusarudzika kubata kodhi haidi kuwedzerwa kana nhamba ye "yakawedzera" mirairo inogona kuderedzwa.

Mukurukuri anoongorora vangangosvika gumi nevaviri vavo uye anoratidza ese ari maviri mamiriro kwaanobatsira kukurumidzira kuitiswa kwechirongwa, uye ayo asina nzira idzi.

Nekudaro, Roman Rusyaev inotungamira vadzidzi kumhedzisiro yekuti kodhi ine kusarudzika kubata haigone kugara ichiitwa ne zero pamusoro, uye inopa zano rinotevera:

  • paunenge uchigadzira maraibhurari, zvakakodzera kusiya zvisiri izvo mumusimboti;
  • kana kusarudzika kuchiri kudikanwa, saka pese pazvinogoneka zvakakodzera kuwedzera noexcept (uye const) modifiers kwese kwese kuitira kuti compiler igone kukwirisa zvakanyanya sezvinobvira.

Kazhinji, mukurukuri akasimbisa maonero ekuti kunze kunoshandiswa zvakanyanya kune zvishoma kana kuregwa zvachose.

Mishumo yemasiraidhi inowanikwa pane iyi link: [β€œC++ kunze kuburikidza nelenzi yeLLVM compiler optimizations”]

Majenareta, coroutines uye humwe huropi-hunyoro hunotapira, Adi Shavit

C ++ Russia: zvakaitika sei
Slide kubva mharidzo

Imwe yemishumo yakawanda pamusangano uyu yakatsaurirwa kune zvitsva muC++20 yaisayeukwa kwete chete neratidziro ine mavara, asiwo nekuzivikanwa kwayo kwakajeka kwezvinetso zviripo nekuunganidza kugadzirisa logic (ye loop, callbacks).

Adi Shavit inosimbisa zvinotevera: nzira dziripo parizvino dzinopfuura nemuunganidzwa wese uye hadzipi mukana kune imwe yepakati mamiriro epakati (kana ivo vanoita mune yekufona kumashure, asi nenhamba huru yezvisingafadzi mhedzisiro, senge Callback Hell) . Zvinoita sekuti kune vanodzokorora, asi kunyangwe navo zvese hazvina kutsvedzerera: hapana zvakajairika kupinda nekubuda mapoinzi (tanga β†’ kuguma nerbegin β†’ bvarura uye zvichingodaro), hazvisi pachena kuti tichadzokorora kwenguva yakareba sei? Kutanga neC ++20, matambudziko aya anogadziriswa!

Chekutanga sarudzo: ranges. Nekuputira iterators, tinowana yakajairwa interface yekutanga nekuguma kweiyo iteration, uye isu tinowanawo kugona kunyora. Zvese izvi zvinoita kuti zvive nyore kugadzira mapaipi ekugadzirisa data akazara. Asi hazvisi zvese zvakatsetseka: chikamu chekuverenga logic chiri mukati mekuita kweiyo iterator chaiyo, iyo inogona kuomesa kodhi kuti inzwisise uye kugadzirisa.

C ++ Russia: zvakaitika sei
Slide kubva mharidzo

Zvakanaka, kune iyi kesi, C ++ 20 yakawedzera coroutines (mafunctions ane maitiro akafanana nemajenareta muPython): kuuraya kunogona kudzikiswa nekudzorera imwe kukosha kwazvino uchichengetedza mamiriro epakati. Nekudaro, isu tinowana kwete chete kushanda nedata sezvazvinoratidzika, asi zvakare kuvharidzira pfungwa dzese mukati meimwe coroutine.

Asi pane nhunzi mumafuta: panguva ino ivo vanongotsigirwa zvishoma nevagadziri varipo, uye zvakare haashandiswe zvakachena sezvatinoda: semuenzaniso, haisati yave yakakodzera kushandisa mareferenzi uye zvinhu zvenguva pfupi mu coroutines. Uyezve, pane zvimwe zvirambidzo pane izvo zvingave coroutines, uye constexpr mabasa, vavaki / vaparadzi, uye chikuru hachibatanidzwe mune iyi runyorwa.

Nekudaro, coroutines inogadzirisa chikamu chakakosha chematambudziko nekureruka kweiyo data yekugadzirisa logic, asi kuita kwavo ikozvino kunoda kuvandudzwa.

Zvinhu:

C ++ tricks kubva kuYandex.Taxi, Anton Polukhin

Mumabasa angu ehunyanzvi, dzimwe nguva ndinofanira kuita zvinhu zvekubatsira chete: chiputiriso pakati peiyo yemukati interface uye API yeimwe raibhurari, kutema matanda kana kupatsanura. Muchiitiko ichi, kazhinji hapana chikonzero chekuwedzera optimization. Asi zvakadini kana zvikamu izvi zvichishandiswa mune mamwe mabasa anozivikanwa paRuNet? Mumamiriro ezvinhu akadaro, iwe uchafanirwa kugadzirisa terabytes paawa yematanda chete! Ipapo millisecond yega yega inoverengera uye saka iwe unofanirwa kutendeukira kune akasiyana manomano - Anton Polukhin akataura nezvavo.

Zvichida muenzaniso unonyanya kufadza waiva kushandiswa kweiyo pointer-to-implementation (pimpl) pattern. 

#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_; 
};

Mumuenzaniso uyu, kutanga ndinoda kubvisa mafaira emusoro emaraibhurari ekunze - izvi zvinounganidza nekukurumidza, uye iwe unogona kuzvidzivirira kubva kune zvinogona kuitika pamazita uye zvimwe zvikanganiso zvakafanana. 

Zvakanaka, takafambisa #include kune .cpp faira: tinoda kuenderera mberi-declaration yeAPI yakaputirwa, pamwe ne std::unique_ptr. Iye zvino tave nekugoverwa kwesimba uye zvimwe zvinhu zvisingafadzi senge data rakapararira muboka re data uye yakaderedzwa vimbiso. std::aligned_storage inogona kubatsira nezvese izvi. 

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_; 
};

Dambudziko rega: iwe unofanirwa kutsanangura saizi uye kurongeka kwega yega wrapper - ngatiite yedu pimpl template ine paramita. , shandisa mamwe maitiro ehumwe uye wedzera cheki kune muparadzi kuti takawana zvese zvakanaka: 

~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"
    ); 
}

Sezvo T yatove yakatsanangurwa painogadzirisa muparadzi, iyi kodhi ichapatsanurwa nenzira kwayo uye padanho rekubatanidza inoburitsa saizi inodiwa uye kurongeka kwakakosha kunoda kuiswa sekukanganisa. Nokudaro, pamutengo weimwe yekuwedzera yekubatanidza kumhanya, tinobvisa kugoverwa kwesimba kwemakirasi akaputirwa, kuviga API mu .cpp faira nekushandiswa, uyewo kuwana dhizaini inonyanya kukodzera caching ne processor.

Kutema matanda uye kupatsanura kwaitaridza kushoma uye nekudaro hazvizotaurwa muongororo iyi.

Mishumo yemasiraidhi inowanikwa pane iyi link: ["C++ matipi kubva kuTaxi"]

Maitiro echimanjemanje ekuchengeta kodhi yako DRY, BjΓΆrn Fahller

Muhurukuro iyi, BjΓΆrn Fahller anoratidza nzira dzakasiyana siyana dzekurwisa chikanganiso chekudzokororwa kwemamiriro ekutarisa:

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

Unonzwika wakajairana here? Nekushandisa akati wandei ane simba C ++ matekiniki akaunzwa mune achangoburwa zviyero, unogona kuita zvine hunyanzvi kuita mashandiro akafanana pasina chirango chekuita. Enzanisa:   

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

Kuti ubate nhamba isina kurongeka yemacheki, iwe unongoda kushandisa variadic matemplate uye kupeta mataurirwo. Ngatifungei kuti tinoda kutarisa kuenzana kwezvakasiyana zvakasiyana kune enum's state_type element. Chinhu chekutanga chinouya mupfungwa kunyora basa remubatsiri is_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

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

Mhedzisiro yepakati iyi inoodza moyo. Parizvino iyo kodhi haisi kuwedzera kuverenga:

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

Non-type template parameters ichabatsira kuvandudza mamiriro acho zvishoma. Nerubatsiro rwavo, isu tichaendesa zvinhu zvisingaverengeke zveenum kune runyorwa rwema template paramita: 

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

Nekushandisa otomatiki mune isiri-mhando template paramende (C++17), nzira yacho inongoenderana nekuenzanisa kwete chete ne state_type zvinhu, asiwo nemhando dzechinyakare dzinogona kushandiswa sedzisiri-mhando template paramita:


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

Kuburikidza nekuvandudzwa uku kunotevedzana, iyo inodiwa yakatsetseka syntax yecheki inowanikwa:


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);

Mumuenzaniso uyu, gwara rekubvisa rinoshanda kuratidza inodiwa chimiro template paramita kune mugadziri, uyo anoziva mhando dzeanovaka nharo. 

Kuwedzera - kunonakidza. Bjorn anodzidzisa maitiro ekugadzirisa kodhi inoguma yekuenzanisa vashandisi kupfuura ==, uyezve nekuita zvisina tsarukano. Munzira, zvinhu zvakadai se no_unique_address attribute (C++20) uye template parameters mu lambda mabasa (C++20) inotsanangurwa uchishandisa mienzaniso yekushandisa. (Hongu, ikozvino lambda syntax yakatonyanya nyore kuyeuka - aya mapeya mana akatevedzana emaparentheses emarudzi ese.) Mhinduro yekupedzisira uchishandisa mabasa semuvaki ruzivo inodziya mweya wangu, tisingarevi matauriro ekuti tuple mutsika dzakanakisa dzelambda. calculus.

Pakupedzisira, usakanganwa kuigadzirisa:

  • Rangarira kuti lambdas ari constexpr mahara; 
  • Ngatiwedzerei kuendesa mberi uye titarise iyo yakashata syntax inoenderana neiyo parameter paki mukuvhara lambda;
  • Ngatipei muunganidzi mikana yakawanda yekugonesa nemamiriro ezvinhu kunze; 
  • Ngatitarisei zvakanyanya kunzwisisika kukanganisa kubuda mumatemplate nekuda kwekujeka kudzoka kukosha kwe lambdas. Izvi zvinomanikidza mugadziri kuti aite mamwe macheki isati yaitwa template basa chairo - pamhando yekutarisa nhanho. 

Kuti uwane ruzivo, ndapota tarisa kune zvinyorwa zvehurukuro: 

Maonero edu

Kutora kwedu kwekutanga muC ++ Russia kwakange kusingakanganwike nekuda kwekusimba kwayo. Ndakawana fungidziro yeC ++ Russia sechiitiko chechokwadi, uko mutsetse pakati pekudzidziswa uye kutaurirana kwehupenyu kunenge kusingaonekwe. Zvese, kubva pamafungiro evatauri kusvika kumakwikwi kubva kune vanobatika chiitiko, zvinogoneka kunhaurirano dzinopisa. Zviri mumusangano uyu, zvinosanganisira mishumo, zvinovhara nyaya dzakasiyana siyana dzinosanganisira C++ kuvandudzwa, zvidzidzo zvemapurojekiti makuru uye kufunga kwekuvaka. Asi zvingave zvisina kunaka kufuratira chikamu chemagariro echiitiko, chinobatsira kukunda zvipingamupinyi zvemutauro maererano kwete neC ++ chete.

Tinotenda varongi vemusangano nemukana wekutora chikamu muchiitiko chakadaro!
Iwe unogona kunge wakaona zvakatumirwa nevarongi nezve zvakapfuura, zvazvino uye ramangwana reC ++ Russia paJUG Ru blog.

Tinotenda nekuverenga, uye tinovimba kuti kutaurazve kwedu kwezviitiko kwakabatsira!

Source: www.habr.com

Voeg