C ++ Russia: ho etsahetse joang

Haeba qalong ea papali u re ho na le khoutu ea C ++ e leketlileng leboteng, joale qetellong e tlamehile ho u thunya leotong.

Bjarne Stroustrup

Ho tloha ka la 31 October ho ea ho la 1 November, seboka sa C ++ Russia Piter se ne se tšoaretsoe St. Petersburg - e 'ngoe ea likopano tse kholo tsa mananeo a Russia, tse hlophisitsoeng ke JUG Ru Group. Libui tse memetsoeng li kenyelletsa litho tsa Komiti ea Maemo ea C++, libui tsa CppCon, bangoli ba libuka tsa O'Reilly, le bahlokomeli ba merero e kang LLVM, libc++, le Boost. Seboka sena se lebisitsoe ho baetsi ba C ++ ba nang le phihlelo ba batlang ho tebisa tsebo ea bona le ho fapanyetsana liphihlelo tsa puisano e phelang. Baithuti, baithuti ba fumaneng mangolo le matichere a univesithi ba fuoa litheolelo tse ntle haholo.

Khatiso ea Moscow ea seboka sena e tla ba teng ho etela mathoasong a April selemong se tlang, empa hajoale liithuti tsa rona li tla u bolella lintho tse thahasellisang tseo li ithutileng tsona ketsahalong ea ho qetela. 

C ++ Russia: ho etsahetse joang

Setšoantšo se tsoang ho alebamo ya kopano

Mabapi le rona

Baithuti ba babeli ba tsoang Sekolong se Phahameng sa Moruo sa Univesithi ea Naha ea Lipatlisiso - St. Petersburg ba sebelitse posong ena:

  • Liza Vasilenko ke seithuti sa selemo sa 4th se ithutang Lipuo tsa Programming e le karolo ea Applied Mathematics le Computer Science program. Kaha ke ne ke tloaelane le puo ea C++ selemong sa ka sa pele univesithing, ka mor'a moo ke ile ka fumana phihlelo ea ho sebetsa le eona ka lithupelo tsa mosebetsi indastering. Takatso ea ka ea ho hlophisa lipuo ka kakaretso le mananeo a sebetsang ka ho khetheha e siile letšoao la eona khethong ea litlaleho kopanong.
  • Danya Smirnov ke seithuti sa selemo sa 1 sa lenaneo la master "Programming and Data Analysis". Ha ke ntse ke le sekolong, ke ile ka ngola mathata a Olympiad ka C ++, 'me ka tsela e itseng ho ile ha etsahala hore puo e lule e hlaha mesebetsing ea thuto' me qetellong ea e-ba puo e ka sehloohong e sebetsang. Ke ile ka etsa qeto ea ho kenya letsoho sebokeng ho ntlafatsa tsebo ea ka le ho ithuta ka menyetla e mecha.

Koranteng, boetapele ba lefapha la thuto hangata bo arolelana tlhahisoleseling mabapi le liketsahalo tsa thuto tse amanang le boits'oaro ba rona. Ka September re bone tlhahisoleseding e mabapi le C ++ Russia 'me ra etsa qeto ea ho ngolisa e le bamameli. Ena ke phihlelo ea rona ea pele ea ho kenya letsoho likopanong tse joalo.

Sebopeho sa seboka

  • Litlaleho

Kamora matsatsi a mabeli, litsebi li ile tsa bala litlaleho tse 30, tse buang ka lihlooho tse ngata tse chesang: ts'ebeliso e bohlale ea likarolo tsa puo ho rarolla mathata a sebelisitsoeng, lintlafatso tsa puo tse tlang mabapi le maemo a macha, ho sekisetsa moralo oa C ++ le litemoso ha o sebetsana le litlamorao tsa bona, mehlala. ea meralo e khahlang ea meralo, hammoho le lintlha tse ling tse tlase tsa moralo oa puo. Litšoantšiso tse tharo li etsahetse ka nako e le 'ngoe, hangata tse peli ka Serussia le e' ngoe ka Senyesemane.

  • Libaka tsa lipuisano

Ka mor'a puo, lipotso tsohle tse sa botsoang le lipuisano tse sa phethoang li ile tsa fetisetsoa libakeng tse khethehileng bakeng sa puisano le libui, tse nang le liboto tsa matšoao. Mokhoa o motle oa ho ha u le hole le khefu lipakeng tsa lipuo ka moqoqo o monate.

  • Lipuisano tsa Lehalima le lipuisano tse sa reroang

Haeba u batla ho fana ka tlaleho e khutšoanyane, u ka ingolisa holim'a letlapa le lesoeu bakeng sa Puo ea Lehalima ea mantsiboea 'me u fumane metsotso e mehlano ea nako ea ho bua ka ntho leha e le efe sehloohong sa kopano. Mohlala, kenyelletso e potlakileng ea li-sanitizer tsa C++ (ho ba bang e ne e le ncha) kapa pale e mabapi le kokoanyana e hlahang molokong oa sine e ka utluoang feela, empa e sa bonoe.

Mokhoa o mong ke oa puisano e nang le sehlooho se reng, “Ka Komiti ea Pelo e Feletseng.” Sethaleng ho na le litho tse ling tsa komiti ea maemo, ho projeke ke sebaka sa mollo (ka molao - ho theha moea o tiileng, empa lebaka la "hobane TSOHLE E TSOHLE" le bonahala le le monate), lipotso mabapi le maemo le pono e akaretsang ea C ++ , ntle le lipuisano tse futhumetseng tsa tekheniki le holiwars. Ho ile ha fumaneha hore komiti e boetse e na le batho ba phelang bao e ka ’nang eaba ha ba na bonnete ba letho ka ntho e itseng kapa ba sa tsebeng letho.

Bakeng sa balateli ba li-holivars, ketsahalo ea boraro e ile ea lula nyeoeng - seboka sa BOF "Go vs. C ++". Re nka moratuoa oa Go, moratuoa oa C++, pele lenaneo le qala ba lokisetsa li-slide tse 100500 ka sehlooho (joaloka mathata a liphutheloana ho C++ kapa khaello ea li-generic ho Go), ebe ba ba le puisano e monate har'a bona le le bamameli, ’me bamameli ba leka ho utloisisa lintlha tse peli ka nako e le ’ngoe . Haeba holivar e qala ntle le moelelo oa taba, mookameli oa kenella le ho boelanya lihlopha. Sebopeho sena sea lemalla: lihora tse 'maloa ka mor'a ho qala, ho ile ha phethoa halofo feela ea li-slide. Bofelo bo ne bo tlameha ho potlakisoa haholo.

  • Molekane o eme

Balekane ba kopano ba ne ba emetsoe liholong - liteisheneng ba ile ba bua ka merero ea morao-rao, ba fana ka lithupelo le mesebetsi, ba tšoara lipotso le litlholisano tse nyane, hape ba hapile limpho tse monate. Ka nako e ts'oanang, lik'hamphani tse ling li bile li ithaopela ho feta mehatong ea pele ea lipuisano, e ka ba molemo ho ba tlileng eseng feela ho mamela litlaleho.

Lintlha tsa tekheniki tsa litlaleho

Re ile ra mamela litlaleho ka matsatsi a mabeli. Ka linako tse ling ho ne ho le thata ho khetha tlaleho e le 'ngoe ho tse tšoanang - re ile ra lumellana ho arohana le ho fapanyetsana tsebo e fumanoeng nakong ea khefu. Mme leha ho le jwalo, ho bonahala ho sa ntsane ho le ngata. Mona re rata ho bua ka litaba tsa litlaleho tse ling tseo re li fumaneng li thahasellisa haholo

Mekhelo ho C++ ka prism ea compiler optimizations, Roman Rusyaev

C ++ Russia: ho etsahetse joang
Thella ho tloha lipuo

Joalo ka ha sehlooho se fana ka maikutlo, Roman o ile a sheba ho sebetsa ntle le mekhelo a sebelisa LLVM joalo ka mohlala. Ka nako e ts'oanang, bakeng sa ba sa sebeliseng Clang mosebetsing oa bona, tlaleho e ntse e ka fana ka maikutlo a hore na khoutu e ka ntlafatsoa joang. Ho joalo hobane baetsi ba li-compilers le lilaebrari tse tsamaellanang ba buisana 'me litharollo tse ngata tse atlehileng li ka tsamaisana.

Kahoo, ho sebetsana le mokhelo, o hloka ho etsa lintho tse ngata: letsetsa khoutu ea ho sebetsana (haeba e le teng) kapa lisebelisoa tsa mahala boemong ba hona joale le ho phunya stack holimo. Sena sohle se lebisa tabeng ea hore moqapi o eketsa litaelo tse eketsehileng bakeng sa mehala e ka 'nang ea lahla mekhelo. Ka hona, haeba mokhelo o sa hlahisoe, lenaneo le ntse le tla etsa liketso tse sa hlokahaleng. E le hore ka tsela e itseng u fokotse holimo, LLVM e na le li-heuristics tse 'maloa bakeng sa ho khetholla maemo moo khoutu ea ho sebetsana le khethollo e sa hlokeng ho eketsoa kapa palo ea litaelo tse "eketsehileng" e ka fokotsoa.

Sebui se hlahloba tse ka bang leshome le metso e ’meli ’me se bontša maemo ao ka bobeli moo a thusang ho potlakisa ho phethoa ha lenaneo, le moo mekhoa ena e sa sebetseng teng.

Ka hona, Roman Rusyaev e tlisa bamameli qetong ea hore khoutu e nang le mosebetsi ntle le mekhelo e ke ke ea etsoa kamehla ka zero, mme e fana ka likeletso tse latelang:

  • ha ho etsoa lilaebrari, ho bohlokoa ho lahla mekhelo ka molao;
  • haeba mekhelo e ntse e hlokahala, neng kapa neng ha ho khonahala ho loketse ho kenyelletsa li-modifiers tsa noexcept (le const) hohle e le hore moqapi a ka ntlafatsa ka hohle kamoo ho ka khonehang.

Ka kakaretso, sebui se tiisitse maikutlo a hore mekhelo e sebelisoa hamolemo ho bonyane kapa ho lahloa ka ho feletseng.

Li-slide tsa tlaleho li fumaneha sehokelong se latelang: [“Mekhelo ea C++ ka lense ea likhomphutha tsa LLVM”]

Lijenereithara, li-coroutines le tse ling tse monate tse thellang boko, Adi Shavit

C ++ Russia: ho etsahetse joang
Thella ho tloha lipuo

E 'ngoe ea litlaleho tse ngata kopanong ena e nehetsoeng ka mekhoa e mecha ea C++20 e ne e sa lebalehe eseng feela bakeng sa tlhahiso ea eona e mebala-bala, empa hape le bakeng sa boitsebiso bo hlakileng ba mathata a teng ka mokhoa oa ho bokella (bakeng sa loop, callbacks).

Adi Shavit e totobatsa tse latelang: mekhoa e teng hona joale e feta har'a pokello eohle 'me ha e fane ka monyetla oa ho fumana boemo bo itseng ba ka hare (kapa e etsa tabeng ea li-callbacks, empa ka palo e kholo ea litla-morao tse sa thabiseng, tse kang Callback Hell) . Ho ka bonahala eka ho na le li-iterators, empa le tsona ntho e 'ngoe le e' ngoe ha e boreleli haholo: ha ho na lintlha tse tloaelehileng tsa ho kena le ho tsoa (qala → qetellong khahlanong le rbegin → rend joalo-joalo), ha ho hlake hore na re tla pheta nako e kae? Ho qala ka C++20, mathata ana a rarollotsoe!

Khetho ea pele: mebala. Ka ho phuthela li-iterators, re fumana sebopeho se tloaelehileng bakeng sa qalo le qetello ea ho pheta-pheta, hape re fumana bokhoni ba ho ngola. Sena sohle se etsa hore ho be bonolo ho aha lipeipi tse felletseng tsa ts'ebetso ea data. Empa ha se ntho e 'ngoe le e' ngoe e boreleli haholo: karolo ea logic ea lipalo e teng ka hare ho ts'ebetsong ea iterator e itseng, e ka thatafatsang khoutu ho utloisisa le ho e lokisa.

C ++ Russia: ho etsahetse joang
Thella ho tloha lipuo

Leha ho le joalo, tabeng ena, C ++ 20 e ekelitse li-coroutines (mesebetsi eo boitšoaro ba eona bo tšoanang le lijenereithara tsa Python): ts'ebetso e ka chechisoa ka ho khutlisa boleng bo itseng ha u ntse u boloka boemo bo bohareng. Ka hona, ha re finyelle feela ho sebetsa ka data kamoo e hlahang kateng, empa hape re kenyelletsa logic eohle ka hare ho coroutine e itseng.

Empa ho na le ntsintsi ka setlolo: hajoale li tšehetsoa ka mokhoa o sa fellang ke baqapi ba teng, hape ha li kenngoe tšebetsong ka makhethe kamoo re ka ratang: ka mohlala, ha e e-so tšoanelehe ho sebelisa litšupiso le lintho tsa nakoana ho li-coroutines. Ho feta moo, ho na le lithibelo tse ling ho seo e ka bang li-coroutines, 'me mesebetsi ea constexpr, bahahi / ba senyang, le ba ka sehloohong ha ba kenyelelitsoe lethathamong lena.

Ka hona, li-coroutines li rarolla karolo e kholo ea mathata ka mokhoa o bonolo oa ho sebetsana le data, empa ts'ebetsong ea bona ea hona joale e hloka ntlafatso.

Lisebelisoa:

C++ maqheka a tsoang ho Yandex.Taxi, Anton Polukhin

Mesebetsing ea ka ea botsebi, ka linako tse ling ke tlameha ho kenya tšebetsong lintho tse thusang: sekoaelo lipakeng tsa sebopeho sa kahare le API ea laeborari e itseng, ho rema lifate kapa ho arola. Tabeng ena, hangata ha ho hlokahale hore ho be le ntlafatso e eketsehileng. Empa ho thoe'ng haeba likarolo tsee li sebelisoa ho tse ling tsa litšebeletso tse ratoang ka ho fetisisa ho RuNet? Boemong bo joalo, o tla tlameha ho sebetsana le li-terabyte ka hora ea lifate u le mong! Ebe millisecond e 'ngoe le e' ngoe e bohlokoa, ka hona o tlameha ho sebelisa maqheka a fapaneng - Anton Polukhin o buile ka bona.

Mohlomong mohlala o thahasellisang ka ho fetisisa e ne e le ts'ebetsong ea mohlala oa 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_; 
};

Mohlala ona, pele ke batla ho tlosa lifaele tsa lihlooho tsa lilaebrari tsa ka ntle - sena se tla bokella ka potlako, 'me u ka itšireletsa likhohlanong tsa mabitso le liphoso tse ling tse tšoanang. 

Ho lokile, re tsamaisitse #include ho faele ea .cpp: re hloka phatlalatso ea pele ea API e phuthetsoeng, hammoho le std::unique_ptr. Hona joale re na le likabelo tse matla le lintho tse ling tse sa thabiseng joalo ka data e hasaneng har'a bongata ba data le litiisetso tse fokotsehileng. std::aligned_storage e ka thusa ka tsena tsohle. 

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

Bothata feela: o hloka ho hlakisa boholo le tlhophiso ea sekoaelo se seng le se seng - ha re etseng template ea rona ea pimpl ka liparamente. , sebelisa litekanyetso tse ling tse hanyetsanang 'me u kenye cheke ho mohatelli hore na tsohle li nepahetse: 

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

Kaha T e se e hlalositsoe ha e sebetsana le mohatelli, khoutu ena e tla aroloa ka nepo 'me sethaleng sa ho bokella e tla hlahisa boholo bo hlokahalang le litekanyetso tsa ho lumellana tse lokelang ho kenngoa e le liphoso. Ka hona, ka litšenyehelo tsa ts'ebetso e 'ngoe e eketsehileng ea ho bokella, re tlosa kabo e matla ea lihlopha tse phuthetsoeng, re pata API ka faele ea .cpp ka ts'ebetsong, hape re fumane moralo o loketseng haholoanyane bakeng sa caching ke processor.

Ho rema lifate le ho arola ho ne ho bonahala ho sa khahlise, ka hona ho ke ke ha boleloa tlhahlobisong ena.

Li-slide tsa tlaleho li fumaneha sehokelong se latelang: ["C++ maqheka a tsoang tekesing"]

Mekhoa ea sejoale-joale ea ho boloka khoutu ea hau e DRY, Björn Fahller

Puong ena, Björn Fahller o bonts'a mekhoa e mengata e fapaneng ea ho loants'a bofokoli ba setaele ba ho hlahloba maemo khafetsa:

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

E utloahala e tloaelehile? Ka ho sebelisa mekhoa e mengata e matla ea C ++ e hlahisitsoeng litekanyetsong tsa morao-rao, o ka kenya tšebetsong ts'ebetso e ts'oanang ntle le kotlo ea ts'ebetso. Bapisa:   

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

Ho sebetsana le palo e sa tsitsang ea licheke, hang-hang u hloka ho sebelisa li-template tse fapaneng le li-meta poleloana. Ha re nke hore re batla ho lekola tekano ea mefuta e mengata ho enum's state_type element. Ntho ea pele e tlang kelellong ke ho ngola tšebetso ea mothusi ke_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

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

Sephetho sena sa mahareng sea soabisa. Ho fihlela hajoale khoutu ha e baloe haholoanyane:

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

Li-parameter tsa template tse se nang mofuta li tla thusa ho ntlafatsa boemo hanyane. Ka thuso ea bona, re tla fetisetsa likarolo tse ngata tsa enum lethathamong la liparamente tsa template: 

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

Ka ho sebelisa koloi ka har'a paramethara ea template e seng ea mofuta (C++17), mokhoa ona o akaretsa feela ho bapisa eseng feela le likarolo tsa state_type, empa hape le mefuta ea khale e ka sebelisoang e le liparamente tsa template tseo e seng tsa mofuta:


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

Ka lintlafatso tsena tse latellanang, syntax e lakatsehang ea licheke e ea fihlelleha:


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

Mohlaleng ona, tataiso ea phokotso e sebeletsa ho fana ka maikutlo a litekanyo tse lakatsehang tsa template ho moqapi, ea tsebang mefuta ea likhang tsa sehahi. 

Ho feta moo - e thahasellisang haholoanyane. Bjorn e ruta mokhoa oa ho akaretsa khoutu e hlahisoang bakeng sa basebelisi ba papiso ho feta ==, ebe bakeng sa ts'ebetso e sa reroang. Tseleng, likarolo tse kang no_unique_address attribute (C++20) le li-parameter tsa template mesebetsing ea lambda (C++20) li hlalosoa ho sebelisoa mehlala ea tšebeliso. (E, hona joale syntax ea lambda e bonolo le ho feta ho e hopola - tsena ke lipara tse 'nè tse latellanang tsa masaka a mefuta eohle.) Tharollo ea ho qetela e sebelisang mesebetsi e le lintlha tsa mohahi e hlile e futhumatsa moea oa ka, re sa bue ka poleloana tuple meetlong e ntle ka ho fetisisa ea lambda. calculus.

Qetellong, u se ke ua lebala ho e bentša:

  • Hopola hore lambdas ke constexpr mahala; 
  • Ha re eketse ho fetisa ka mokhoa o phethahetseng 'me re shebe syntax ea eona e mpe mabapi le pakete ea parameter ho koaloa ha lambda;
  • Ha re fe mohlophisi menyetla e mengata ea ho ntlafatsa ka maemo ntle le; 
  • Ha re hlokomeleng tlhahiso e utloisisoang haholoanyane ea litempele ka lebaka la boleng bo hlakileng ba ho khutla ba lambdas. Sena se tla qobella moqapi ho etsa licheke tse ling pele mosebetsi oa template o bitsoa - sethaleng sa ho hlahloba mofuta. 

Ho fumana lintlha, ka kopo sheba lisebelisoa tsa thuto: 

Maikutlo a rona

Ho kenya letsoho ha rona pele ho C ++ Russia ho ne ho sa lebalehe ka matla a eona. Ke ile ka ba le maikutlo a C ++ Russia e le ketsahalo e tšepahalang, moo moeli pakeng tsa koetliso le puisano e phelang e batlang e sa bonahale. Ntho e 'ngoe le e' ngoe, ho tloha maikutlong a libui ho ea ho litlhōlisano tse tsoang ho balekane ba ketsahalo, li loketse lipuisano tse chesang. Likahare tsa seboka sena, tse nang le litlaleho, li akaretsa lihlooho tse ngata tse fapaneng ho kenyeletsoa lintlafatso tsa C++, lithuto tsa merero e meholo le menahano ea meralo ea meaho. Empa e ka ba ho hloka toka ho iphapanyetsa karolo ea sechaba ea ketsahalo eo, e thusang ho hlola litšitiso tsa puo mabapi le C ++ feela.

Re leboha bahlophisi ba kopano ka monyetla oa ho kenya letsoho ketsahalong e joalo!
E ka 'na eaba u bone poso ea bahlophisi ka nako e fetileng, ea hona joale le ea bokamoso ba C++ Russia ho blog ea JUG Ru.

Re leboha ho bala, 'me re tšepa hore ho pheta liketsahalo ho bile le thuso!

Source: www.habr.com

Eketsa ka tlhaloso