C++ Russia: pehea i tupu ai

Mena i te timatanga o te takaro ka kii koe kei reira te tohu C++ e iri ana ki te pakitara, ka mutu ka herea koe ki te kopere i to waewae.

Bjarne Stroustrup

Mai i te Oketopa 31 ki te Whiringa-a-rangi 1, i tu te hui C++ Russia Piter ki St. Ko nga kaikorero manuhiri ko nga mema o te Komiti Paerewa C++, nga kaikorero CppCon, nga kaituhi pukapuka O'Reilly, me nga kaitiaki o nga kaupapa penei i te LLVM, libc++, me te Boost. Ko te huihuinga e whai ana ki nga kaihanga mohio C++ e hiahia ana ki te whakahohonu i o raatau tohungatanga me te whakawhiti wheako i roto i nga korero ora. Ko nga akonga, nga akonga paetahi me nga kaiako whare wananga ka whakawhiwhia ki nga utu tino pai.

Ko te putanga o Moscow o te huihuinga ka waatea ki te toro atu i te timatanga o Paenga-whawha o tera tau, engari i tenei wa ka korero a taatau akonga ki a koe he aha nga mea whakamiharo i akohia e ratou i te huihuinga whakamutunga. 

C++ Russia: pehea i tupu ai

Whakaahua mai pukaemi hui

О нас

Tokorua nga tauira mai i te Whare Wananga Rangahau Motu o te Kura Ohaoha - St. Petersburg i mahi i tenei pou:

  • Ko Liza Vasilenko he tauira paetahi o te tau 4 e ako ana i nga Reo Papatono hei wahanga o te kaupapa Pangangarau me te Rorohiko Rorohiko. I taku mohiotanga ki te reo C++ i taku tau tuatahi i te whare wananga, no muri mai ka whai wheako ahau ki te mahi ki a ia na roto i nga mahi whakangungu i roto i te umanga. Ko taku kaingākau ki ngā reo whakahōtaka i roto i te whānuitanga me te kaupapa mahi i roto i te waa i waiho tana tohu mo te kowhiringa o nga purongo i te huihuinga.
  • Ko Danya Smirnov he akonga 1st tau o te kaupapa a te rangatira "Patonotanga me te Raraunga Raraunga". I a au ano i te kura, i tuhi ahau i nga raruraru Olympiad ki te C++, katahi ano ka puta te reo i nga wa katoa i roto i nga mahi matauranga, ka mutu ka noho hei reo mahi matua. I whakatau ahau ki te whai waahi ki te huihuinga hei whakapai ake i oku mohiotanga me te ako ano mo nga huarahi hou.

I roto i te panui, he maha nga korero a te kaiarahi o nga kaiako mo nga huihuinga matauranga e pa ana ki to maatau tohungatanga. I te marama o Hepetema i kite matou i nga korero mo C++ Russia ka whakatau ki te rehita hei kai whakarongo. Koinei to matou wheako tuatahi ki te whai waahi ki enei huihuinga.

Hanganga hui

  • Ripoata

I roto i nga ra e rua, ka panuihia e nga tohunga nga purongo 30, he maha nga kaupapa wera: te whakamahi mohio o nga ahuatanga reo ki te whakaoti rapanga tono, nga whakahou reo e haere mai ana e pa ana ki te paerewa hou, nga whakararu i roto i te hoahoa C++ me nga whakatupato i te wa e mahi ana me o raatau hua, tauira. o nga hoahoanga kaupapa whakahihiri, me etahi korero i raro i te kaupapa o te hanganga reo. E toru nga whakaaturanga i puta i te wa kotahi, ko te nuinga o nga wa e rua i te reo Ruhia me tetahi i te reo Ingarihi.

  • Nga waahi matapaki

Whai muri i te whaikorero, ko nga patai katoa kaore ano kia pataia me nga korerorero kaore ano kia oti i whakawhitia ki nga waahi kua tohua mo te whakawhitiwhiti korero me nga kaikorero, me nga papa tohu. He huarahi pai ki te wehe i te wehenga i waenga i nga whaikorero me te korerorero pai.

  • Nga Korero Uira me nga korerorero opaki

Mena kei te hiahia koe ki te tuku purongo poto, ka taea e koe te haina ki runga i te papa ma mo te korero Uira o te ahiahi me te whai waahi mo te rima meneti ki te korero mo tetahi mea mo te kaupapa o te huihuinga. Hei tauira, he whakataki tere ki nga kai horoi mo C++ (mo etahi he mea hou) he korero ranei mo tetahi pepeke i roto i te whakatipuranga ngaru ira ka rangona noa, engari kaore e kitea.

Ko tetahi atu whakatakotoranga ko te korerorero a te roopu "Ki te ngakau ki te ngakau Komiti." Kei runga i te atamira etahi mema o te komiti whakarite, kei runga i te kaupapa he ahi ahi (mana - ki te hanga i te wairua pono, engari ko te take "no te mea kei te ahi nga mea katoa" he ahua katakata), nga patai mo te paerewa me te tirohanga whanui o C++ , kaore he whakawhitinga korero hangarau wera me nga holiwars. Ko te ahua kei roto ano i te komiti nga tangata ora kaore pea i te tino mohio ki tetahi mea, kaore ranei i te mohio ki tetahi mea.

Mo nga kaiwhaiwhai o holivars, ko te tuatoru o nga huihuinga i noho tonu ki runga i te keehi - ko te huihuinga BOF "Haere ki te C++". Ka mau matou i tetahi hoa aroha ki a Go, he hoa aroha ki a C++, i mua i te tiimata o te huihuinga ka whakarite tahi ratou i nga kiriata 100500 mo tetahi kaupapa (penei i nga raru ki nga kete kei te C++ me te kore o nga momo momo i roto i te Haere), katahi ka ora tonu te korerorero ki a ratou ano. me te hunga whakarongo, ka ngana te hunga whakarongo ki te mohio ki nga whakaaro e rua i te wa kotahi. Mena ka timata te holivar i waho o te horopaki, ka wawao te kaiwhakariterite me te hohou i nga taha. Ko tenei whakatakotoranga he mea taapiri: he maha nga haora i muri i te tiimata, ko te haurua noa o nga kiriata i oti. Ko te mutunga me tino tere.

  • Ka tu te hoa

Ko nga hoa o te hui i whakakanohi ki roto i nga horo - i nga tuuraa i korero ratou mo nga kaupapa o naianei, i whakawhiwhia ki nga whakangungu me nga mahi, i whakahaere patapatai me nga whakataetae iti, me te tuku i nga taonga papai. I te wa ano, ko etahi o nga kamupene i tuku ki te haere i nga waahanga tuatahi o nga uiuinga, ka whai hua pea mo te hunga i tae mai ehara i te whakarongo ki nga purongo anake.

Nga korero hangarau o nga purongo

I whakarongo matou ki nga purongo i nga ra e rua. I etahi wa he uaua ki te whiriwhiri i tetahi purongo mai i nga korero whakarara - i whakaae matou ki te wehewehe me te whakawhiti i nga matauranga i riro mai i nga wa okioki. Heoi ano, te ahua nei he maha nga mea kua mahue. I konei e hiahia ana matou ki te korero mo nga korero o etahi o nga purongo i kitea e matou he tino pai

He rereke i roto i te C++ na roto i te arotautanga o te hunga whakahiato, Roman Rusyaev

C++ Russia: pehea i tupu ai
Kiriata mai whakaarotanga

E ai ki te taitara, i titiro a Roman ki te mahi me nga tuunga ma te whakamahi i te LLVM hei tauira. I te wa ano, mo te hunga kaore i te whakamahi i a Clang i roto i a raatau mahi, ka taea tonu e te ripoata te whakaatu me pehea te whakatika i te waehere. I penei na te mea ko nga kaiwhakawhanake o nga kaitoi me nga whare pukapuka paerewa e rite ana ki te whakawhitiwhiti korero ki a raatau ano, a he maha nga otinga angitu ka taea te whakakotahi.

Na, ki te hapai i tetahi tuunga, me mahi koe i te maha o nga mea: waeahia te waehere whakahaere (mehemea) he rauemi kore utu ranei kei te taumata o naianei ka huri ki runga ake te puranga. Ko enei katoa ka arahi ki te meka ka taapirihia e te kaitoha etahi atu tohutohu mo nga waea ka taea pea te maka atu. No reira, ki te kore e whakaarahia te tuunga, ka mahi tonu te kaupapa i nga mahi koretake. Kia taea ai te whakaiti i runga ake, he maha nga heuristics a LLVM mo te whakatau i nga ahuatanga kaore e tika kia taapirihia te waehere whakahaere motuhake, ka taea ranei te whakaiti i te maha o nga tohutohu "atu".

Ka tirohia e te kaikorero mo te tekau ma rua o ratou, ka whakaatu i nga ahuatanga e rua ka awhina i te tere o te whakatinanatanga o nga kaupapa, me nga waahi kaore e tika ana enei tikanga.

No reira, ka arahi a Roman Rusyaev i nga akonga ki te whakatau ko te waehere kei roto i te whakahaere motuhake e kore e taea te whakahaere i nga wa katoa me te kore o runga ake, me te whakaatu i nga tohutohu e whai ake nei:

  • i te wa e whakawhanake ana i nga whare pukapuka, he pai ki te whakarere i nga tuunga o te kaupapa;
  • Mena kei te hiahiatia tonu nga tuunga, katahi ka taea te taapiri i nga whakarereke (me te const) ki nga waahi katoa kia taea ai e te kaitoha te arotau i nga mea e taea ana.

I te nuinga o te waa, i whakapumau te kaikorero i te whakaaro he pai ake te whakamahi i nga tuunga ki te iti rawa, ka whakarerea katoatia ranei.

E waatea ana nga kiriata ripoata i te hononga e whai ake nei: ["C++ motuhake na roto i te arotahi o te LLVM compiler optimizations"]

Kaihanga, coroutines me etahi atu momo reka o te roro, ko Adi Shavit

C++ Russia: pehea i tupu ai
Kiriata mai whakaarotanga

Ko tetahi o nga purongo maha i tenei huihuinga i whakatapua ki nga mahi hou i roto i te C++ 20 he mea maumahara ehara i te mea mo tana whakaaturanga karaehe, engari mo tana maaramatanga o nga raru o mua me te arorau tukatuka kohinga (mo te kopikopiko, nga waea hoki).

E whakaatu ana a Adi Shavit i nga mea e whai ake nei: ko nga tikanga e waatea ana i tenei wa ka uru ki roto i te kohinga katoa kaore e uru ki etahi ahuatanga o roto (ka mahi ranei i roto i te keehi o nga waea whakahoki, engari me te maha o nga paanga kino kino, penei i te Callback Hell) . Ko te ahua kei reira nga kaitoro, engari ahakoa ki a raatau kaore nga mea katoa e tino maeneene: karekau he waahi urunga me nga putanga noa (tīmata → mutunga ki te rbegin → rend me etahi atu), kaore i te maarama kia pehea te roa ka huri? Ka timata i te C++20, ka whakatauhia enei raru!

Kōwhiringa tuatahi: awhe. Ma te takai iterators, ka whiwhi tatou i te atanga noa mo te timatanga me te mutunga o te whitiwhitinga, ka whiwhi hoki tatou i te kaha ki te tito. Ko enei mea katoa ka ngawari ki te hanga i nga paipa tukatuka raraunga katoa. Engari ehara nga mea katoa i te maeneene: ko tetahi waahanga o te arorau tatauranga kei roto i te whakatinanatanga o tetahi kaitoro motuhake, ka taea te whakararu i te waehere ki te maarama me te patuiro.

C++ Russia: pehea i tupu ai
Kiriata mai whakaarotanga

Ae, mo tenei keehi, ka taapirihia e C++20 nga coroutines (nga mahi he rite te ahua ki nga kaihanga i roto i te Python): ka taea te whakaroa ma te whakahoki i etahi uara o naianei me te pupuri i tetahi ahuatanga takawaenga. No reira, ka whakatutukihia e maatau te mahi me nga raraunga ka rite ki te ahua, engari ki te whakauru i nga arorau katoa ki roto i tetahi coroutine motuhake.

Engari he namu kei roto i te hinu: i tenei wa e tautokohia ana e nga kaitoi o naianei, kaore ano hoki i te whakatinanahia kia rite ki ta matou e pai ai: hei tauira, kaore ano kia pai te whakamahi i nga tohutoro me nga taonga rangitahi i roto i nga coroutines. I tua atu, he here etahi mo nga mea ka taea te coroutines, me nga mahi constexpr, nga kaihanga/kaiwhakangaro, me nga mea matua kaore i uru ki tenei rarangi.

Na, ka whakaotihia e nga coroutine tetahi waahanga nui o nga raru me te ngawari o te arorau tukatuka raraunga, engari ko o raatau whakatinanatanga o naianei me whakapai ake.

Ngā rauemi:

Nga tinihanga C++ mai i Yandex.Taxi, Anton Polukhin

I roto i aku mahi ngaio, i etahi wa ka mahia e au etahi mea awhina: he takai i waenga i te atanga o roto me te API o etahi whare pukapuka, te takiuru, te poroporo ranei. I tenei keehi, kaore he hiahia mo etahi atu arotautanga. Engari mehemea ka whakamahia enei waahanga ki etahi o nga ratonga rongonui i runga i te RuNet? I tenei ahuatanga, me mahi koe i nga terabytes mo ia haora o nga poro rakau anake! Na ka tatau ia milliseconds na reira me whai koe ki nga momo tinihanga - i korero a Anton Polukhin mo ratou.

Ko te tauira tino pai ko te whakatinanatanga o te tauira tohu-ki-whakatinana (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_; 
};

I tenei tauira, i te tuatahi ka hiahia ahau ki te whakakore i nga konae pane o nga whare pukapuka o waho - ka tere ake te whakahiato, ka taea e koe te tiaki i a koe mai i nga tautohetohe ingoa me etahi atu hapa rite. 

Kaati, i nekehia e matou te #include ki te konae .cpp: me whakapuakanga whakamua o te API takai, me te std::unique_ptr. Inaianei kei a maatau nga tohatoha hihiri me etahi atu mea kino penei i nga raraunga kua marara puta noa i te tini o nga raraunga me nga taurangi whakaheke. std::aligned_storage ka taea te awhina i enei mea katoa. 

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

Ko te raru anake: me tohu e koe te rahi me te tirohanga mo ia takai - me hanga ta tatou tauira pimpl me nga tawhā , whakamahia etahi uara karekau me te taapiri i te haki ki te kaitukino i tika nga mea katoa: 

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

I te mea kua tautuhia a T i te wa e tukatuka ana i te kaiwhakangaro, ka tika te whakamaarama i tenei waehere a i te waahanga whakahiato ka puta te rahi e hiahiatia ana me nga uara whakatika e tika ana kia whakauruhia hei hapa. Na, i te utu o tetahi atu oma whakahiato, ka whakakorehia e matou te tohatoha hihiri o nga karaehe takai, ka huna i te API ki roto i te konae .cpp me te whakatinanatanga, ka whiwhi hoki i tetahi hoahoa e pai ake ana mo te keteroki e te tukatuka.

Ko te rakaraka me te poroporo he ahua iti ake te whakamīharo, no reira karekau e whakahuahia i roto i tenei arotake.

E waatea ana nga kiriata ripoata i te hononga e whai ake nei: ["C++ tinihanga mai i te Taxi"]

Nga tikanga hou mo te pupuri i to waehere kia MORE, Björn Fahller

I roto i tenei korero, e whakaatu ana a Björn Fahller i nga huarahi rereke hei whawhai i te koha o te ahua o nga arowhai ahuatanga.

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

He reo mohio? Ma te whakamahi i te maha o nga tikanga C++ kaha i whakaurua mai i nga paerewa tata nei, ka taea e koe te whakamahi huatau i taua mahi me te kore he whiunga mahi. Whakataurite:   

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

Ki te whakahaere i te maha o nga arowhai, me whakamahi tonu koe i nga tauira rerekee me nga korero kopa. Me whakaaro tatou e hiahia ana tatou ki te tirotiro i te rite o etahi taurangi ki te huānga state_type o te enum. Ko te mea tuatahi ka puta ki te hinengaro ko te tuhi i tetahi mahi kaiawhina 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) || ...); 
}

He pouri tenei hua takawaenga. I tenei wa kaore ano te waehere e kaha ake te panui:

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

Ko nga tawhā tauira kore-momo ka awhina i te whakapai ake i te ahuatanga. Ma ta raatau awhina, ka whakawhitia e matou nga waahanga o te enum ki te rarangi o nga tawhā tauira: 

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

Ma te whakamahi aunoa i roto i te tawhā tauira momo-kore (C++17), ka whakawhanui noa te huarahi ki nga whakataurite ehara i te mea ki nga huānga state_type anake, engari me nga momo taketake ka taea te whakamahi hei tawhā tauira-kore:


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

Na enei whakapainga whai muri, ka tutuki te wetereo matatau mo nga arowhai:


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

I roto i tenei tauira, ko te aratohu tangohanga hei whakaatu i nga tawhā tauira hanganga e hiahiatia ana ki te kaikohi, e mohio ana ki nga momo tohenga kaihanga. 

I tua atu - he pai ake. Ka whakaakona a Bjorn me pehea te whakawhanui i te waehere ka puta mo nga kaiwhakariterite i tua atu o ==, katahi mo nga mahi noa. I te huarahi, ko nga ahuatanga penei i te huanga no_unique_address (C++20) me nga tawhā tauira i roto i nga mahi lambda (C++20) ka whakamaramatia ma te whakamahi i nga tauira whakamahi. (Ae, inaianei ko te wetereo lambda he maamaa ake te mahara - e wha enei takirua takirua o nga momo rea katoa.) Ko te otinga whakamutunga ma te whakamahi i nga mahi hei korero mo te kaihanga ka tino whakamahana toku wairua, kaua e whakahua i te kupu tuple i roto i nga tikanga pai o lambda. tātai.

I te mutunga, kaua e wareware ki te whakakoi ake:

  • Kia mahara ko nga lambdas he constexpr mo te kore utu; 
  • Me taapiri atu te tuku whakamua tino pai me te titiro ki tana wetereo kino e pa ana ki te paanui tawhā i te katinga lambda;
  • Kia nui ake nga whai waahi ki te kaitoi mo te arotautanga me te kore herekore; 
  • Kia kaha ake te maarama ki te whakaputa hapa i roto i nga tauira na nga uara whakahoki o lambdas. Ma tenei ka kaha te kaikoipi ki te mahi i etahi atu arowhai i mua i te karangatanga o te mahi tauira - i te waahi tirotiro momo. 

Mo nga taipitopito, tirohia nga rauemi kauhau: 

To tatou mau mana'o

Ko ta matou whakauru tuatahi ki C++ Russia he mea maumahara mo tona kaha. I whiwhi ahau i te whakaaro o C ++ Russia hei huihuinga pono, kei reira te raina i waenga i te whakangungu me te korero ora kaore e kitea. Ko nga mea katoa, mai i te ahua o nga kaikorero tae atu ki nga whakataetae mai i nga hoa o te huihuinga, e pai ana ki nga korerorero wera. Ko nga korero o te huihuinga, ko nga purongo, e kapi ana i te whanuitanga o nga kaupapa tae atu ki nga mahi hou C++, nga rangahau take o nga kaupapa nui me nga whakaaro hoahoanga whakaaro. Engari karekau he tika ki te wareware i te waahanga hapori o te huihuinga, e awhina ana ki te hinga i nga arai reo e pa ana ki te C++ anake.

Ka mihi matou ki nga kaiwhakahaere o te hui mo te whai waahi ki te uru atu ki tenei huihuinga!
Kua kite pea koe i nga korero a nga kaiwhakarite mo nga korero o mua, o naianei me nga wa kei te heke mai o C++ Russia i runga i te rangitaki JUG Ru.

Nga mihi mo te panui, me te tumanako i awhina to maatau korero mo nga huihuinga!

Source: will.com

Tāpiri i te kōrero