C++ Russia: ahoana no nitrangan'izany

Raha eo am-piandohan'ny lalao dia milaza ianao fa misy kaody C ++ mihantona eo amin'ny rindrina, amin'ny farany dia tsy maintsy hitifitra anao amin'ny tongotra ianao.

Bjarne Stroustrup

Nanomboka tamin'ny 31 Oktobra ka hatramin'ny 1 Novambra, ny fihaonambe C++ Russia Piter dia natao tao Saint-Pétersbourg - iray amin'ireo fihaonambe fandaharana lehibe ao Rosia, nokarakarain'ny JUG Ru Group. Ny mpandahateny vahiny dia ahitana mpikambana ao amin'ny Komitin'ny fenitra C++, mpandahateny CppCon, mpanoratra boky O'Reilly, ary mpitahiry tetikasa toy ny LLVM, libc++, ary Boost. Ny fihaonambe dia mikendry ireo mpamorona C ++ za-draharaha izay te-handalina ny fahaizany sy hifanakalo traikefa amin'ny fifandraisana mivantana. Mpianatra, mpianatra nahazo diplaoma ary mpampianatra amin'ny oniversite dia omena fihenam-bidy tena tsara.

Ny andiany Moscou amin'ny fihaonambe dia ho azo tsidihina amin'ny fiandohan'ny volana aprily amin'ny taona ho avy, fa mandritra izany fotoana izany ny mpianatra dia hilaza aminao izay zavatra mahaliana nianarany tamin'ny hetsika farany. 

C++ Russia: ahoana no nitrangan'izany

Sary avy amin'ny rakikira fihaonambe

About us

Mpianatra roa avy ao amin'ny National Research University Higher School of Economics - St. Petersburg no niasa tamin'ity lahatsoratra ity:

  • Liza Vasilenko dia mpianatra amin'ny taona faha-4 mianatra amin'ny Programming Language ao anatin'ny programa Applied Mathematics and Computer Science. Rehefa nahafantatra ny fiteny C ++ aho tamin'ny taona voalohany tao amin'ny anjerimanontolo, dia nahazo traikefa niasa tamin'izany aho tamin'ny alalan'ny internship tao amin'ny indostria. Ny fitiavako amin'ny fiteny fandaharana amin'ny ankapobeny sy ny fandaharana miasa indrindra indrindra dia namela marika tamin'ny fifantenana ny tatitra tamin'ny fihaonambe.
  • Danya Smirnov dia mpianatra amin'ny taona 1 amin'ny programa maîtrise "Programming and Data Analysis". Fony aho mbola tany am-pianarana dia nanoratra olana tamin'ny Olympiad tamin'ny C ++ aho, ary avy eo dia nitranga fa tonga hatrany amin'ny hetsika fanabeazana ilay fiteny ary lasa fiteny tena miasa. Nanapa-kevitra ny handray anjara amin'ny fihaonambe aho mba hanatsarana ny fahalalako ary hianatra momba ireo fahafahana vaovao ihany koa.

Ao amin'ny gazety, matetika ny mpitarika ny mpampianatra dia mizara vaovao momba ny hetsika fanabeazana mifandraika amin'ny fahaizantsika manokana. Tamin'ny volana septambra dia nahita vaovao momba ny C++ Russia izahay ary nanapa-kevitra ny hisoratra anarana ho mpihaino. Ity no traikefa voalohany amin'ny fandraisana anjara amin'ny fihaonambe toy izany.

Rafitra fihaonambe

  • tatitra

Tao anatin'ny roa andro, ny manam-pahaizana dia namaky tatitra 30, mirakitra lohahevitra mafana maro: fampiasana fahaiza-manao amin'ny endri-pitenenana hamahana ny olana ampiharina, fanavaozana ny fiteny ho avy mifandraika amin'ny fenitra vaovao, marimaritra iraisana amin'ny famolavolana C++ sy fitandremana rehefa miasa amin'ny vokany, ohatra. momba ny maritrano tetikasa mahaliana, ary koa ny antsipirian'ny fotodrafitrasa momba ny fiteny. Fampisehoana telo no natao niaraka, matetika roa tamin'ny teny Rosiana ary iray tamin'ny teny anglisy.

  • Faritra dinika

Taorian’ny lahateny dia nafindra tany amin’ny faritra voatondro manokana hifandraisana amin’ireo mpandahateny ny fanontaniana rehetra tsy mbola voapetraka sy ny fifanakalozan-kevitra tsy vita, izay misy takela-bato. Fomba tsara hanalavirana ny fiatoana eo anelanelan'ny lahateny miaraka amin'ny resaka mahafinaritra.

  • Resaka tselatra sy fifanakalozan-kevitra tsy ara-potoana

Raha te-hanome tatitra fohy ianao dia afaka misoratra anarana eo amin'ny solaitrabe amin'ny lahateny helatra amin'ny hariva ary mahazo fotoana dimy minitra hiresahana momba ny lohahevitra momba ny fihaonambe. Ohatra, fampidirana haingana ny mpanadio ho an'ny C ++ (ho an'ny sasany dia vaovao izany) na tantara momba ny bibikely amin'ny famokarana onja sinema izay heno fotsiny fa tsy hita.

Fomba iray hafa koa ny fifanakalozan-kevitra “Amin’ny Komitin’ny Fo”. Eo amin'ny lampihazo dia misy mpikambana sasany ao amin'ny komity manara-penitra, eo amin'ny projector dia fatana (amin'ny fomba ofisialy - mba hamoronana rivo-piainana tso-po, fa ny antony "satria mirehitra ny zava-drehetra" dia toa mampihomehy kokoa), fanontaniana momba ny fenitra sy ny fahitana ankapobeny amin'ny C ++ , tsy misy adihevitra ara-teknika mafana sy holiwars. Hita tamin’io komity io koa fa misy olona velona izay mety tsy matoky tanteraka na mety tsy mahalala zavatra.

Ho an'ireo mpankafy ny holivar, nijanona teo amin'ny raharaha ny hetsika fahatelo - ny fivoriana BOF "Go vs. C++". Maka Go lover izahay, tia C ++, alohan'ny hanombohan'ny fotoam-pivoriana dia miara-manomana slides 100500 momba ny lohahevitra iray izy ireo (toy ny olana amin'ny fonosana amin'ny C ++ na ny tsy fisian'ny générics ao amin'ny Go), ary avy eo dia misy fifanakalozan-kevitra mavitrika eo amin'izy ireo ary miaraka amin’ny mpanatrika, ary miezaka mahazo hevitra roa indray miaraka ny mpanatrika . Raha manomboka tsy mifanaraka amin'ny contexte ny holivar dia miditra an-tsehatra ny mpandrindra ary mampihavana ny andaniny sy ny ankilany. Ity endrika ity dia mampiankin-doha: ora maromaro aorian'ny fanombohana dia ny antsasaky ny slides ihany no vita. Tsy maintsy nanafaingana be ny farany.

  • Mijoro ny mpiara-miasa

Ireo mpiara-miombon'antoka tamin'ny fihaonambe dia nisolo tena tao amin'ny efitrano - teo amin'ny lampihazo izy ireo dia niresaka momba ny tetikasa misy ankehitriny, nanolotra fiofanana sy asa, nanao quizzes sy fifaninanana kely, ary nanolotra loka mahafinaritra ihany koa. Nandritra izany fotoana izany, ny orinasa sasany dia nanolotra ny handeha amin'ny dingana voalohany amin'ny dinidinika, izay mety mahasoa ho an'ireo izay tonga tsy hihaino tatitra fotsiny.

Ny antsipiriany ara-teknika momba ny tatitra

Nihaino tatitra izahay roa andro. Sarotra indraindray ny nisafidy tatitra iray avy amin'ireo mitovitovy - nifanaiky izahay hisaraka sy hifanakalo ny fahalalana azo nandritra ny fiatoana. Ary na dia izany aza, dia toa be dia be ny sisa. Eto izahay dia te hiresaka momba ny votoatin'ny tatitra sasany izay hitanay fa mahaliana indrindra

Exceptions amin'ny C ++ amin'ny alàlan'ny prisma amin'ny optimizations compiler, Roman Rusyaev

C++ Russia: ahoana no nitrangan'izany
Midira avy amin'ny презентации

Araka ny soso-kevitry ny lohateny, i Roman dia nijery ny fiasana miaraka amin'ny maningana amin'ny fampiasana LLVM ho ohatra. Mandritra izany fotoana izany, ho an'ireo izay tsy mampiasa Clang amin'ny asany, ny tatitra dia mbola afaka manome hevitra momba ny fomba mety ho fanatsarana ny code. Izany dia satria ny mpamorona ny compiler sy ny trano famakiam-boky manara-penitra mifanaraka amin'izy samy izy ary ny vahaolana mahomby maro dia afaka mifanandrify.

Noho izany, mba hiatrehana ny maningana dia mila manao zavatra maro ianao: antsoy ny kaody fitantanana (raha misy) na loharano maimaim-poana amin'ny ambaratonga ankehitriny ary atsangano ambony kokoa ny stack. Izany rehetra izany dia mitarika ho amin'ny zava-misy fa ny compiler dia manampy toromarika fanampiny ho an'ny antso izay mety hanipy maningana. Noho izany, raha tsy tena atsangana ny maningana, ny programa dia mbola hanao hetsika tsy ilaina. Mba hampihenana ny overhead, ny LLVM dia manana heuristics maromaro hamaritana toe-javatra izay tsy mila ampiana kaody fitantanana manokana na mety hampihena ny isan'ny torolalana "fanampiny".

Ny mpandahateny dia mandinika am-polony eo ho eo amin'izy ireo ary mampiseho ireo toe-javatra roa izay manampy azy ireo hanafaingana ny fanatanterahana ny programa, ary ireo izay tsy azo ampiharina ireo fomba ireo.

Noho izany, i Roman Rusyaev dia mitarika ny mpianatra amin'ny fanatsoahan-kevitra fa ny fehezan-dalàna misy ny fikarakarana manokana dia tsy azo tanterahina amin'ny aotra ambony, ary manome izao torohevitra manaraka izao:

  • rehefa manamboatra tranomboky dia ilaina ny miala amin'ny fitsipika;
  • raha toa ka mbola ilaina ny exception, dia isaky ny azo atao dia mendrika ny asiana modifiers noexcept (sy const) eny rehetra eny mba ahafahan'ny compiler manatsara araka izay tratra.

Amin'ny ankapobeny, ny mpandahateny dia nanamafy ny fiheverana fa ny maningana dia ampiasaina amin'ny faran'ny kely indrindra na ariana tanteraka.

Ny slides tatitra dia azo jerena amin'ity rohy manaraka ity: ["C++ exceptions amin'ny alàlan'ny LLVM compiler optimizations"]

Mpamokatra, coroutine ary mamy hafa mampivelatra ny atidoha, Adi Shavit

C++ Russia: ahoana no nitrangan'izany
Midira avy amin'ny презентации

Ny iray amin'ireo tatitra maro tamin'ity kaonferansa natokana ho an'ny fanavaozana ao amin'ny C ++ 20 ity dia tsy hay hadinoina noho ny famelabelarana miloko, fa koa noho ny famantarana mazava ny olana misy amin'ny lojika fanodinana fanangonana (ho an'ny loop, callbacks).

Adi Shavit dia manasongadina ireto manaraka ireto: ny fomba misy amin'izao fotoana izao dia mandalo amin'ny fanangonana manontolo ary tsy manome fahafahana miditra amin'ny fanjakana intermediate sasany (na manao izany amin'ny trangan'ny antso miverina, saingy misy fiantraikany ratsy maro be, toy ny Callback Hell). . Toa misy iterators, fa na dia miaraka amin'izy ireo aza dia tsy dia milamina ny zava-drehetra: tsy misy teboka idirana sy fivoahana mahazatra (manomboka → mifarana amin'ny rbegin → rend sy ny sisa), tsy fantatra mazava hoe hafiriana no hiverenana? Manomboka amin'ny C++20 dia voavaha ireo olana ireo!

Safidy voalohany: faritra. Amin'ny alàlan'ny fametahana iterators, dia mahazo interface mahazatra ho an'ny fiandohana sy fiafaran'ny famerimberenana, ary mahazo ny fahaizana mamorona ihany koa. Izany rehetra izany dia manamora ny fananganana fantsona fanodinana data feno. Saingy tsy ny zava-drehetra dia malama: ny ampahany amin'ny lojikan'ny kajy dia hita ao anatin'ny fampiharana ny iterator iray manokana, izay mety hanasarotra ny kaody mba hahatakarana sy hanesorana azy.

C++ Russia: ahoana no nitrangan'izany
Midira avy amin'ny презентации

Eny, ho an'ity tranga ity, C ++ 20 dia nanampy coroutines (asa izay mitovitovy amin'ny mpamokatra amin'ny Python): ny famonoana dia azo ahemotra amin'ny famerenana ny sanda misy ankehitriny ary mitahiry fanjakana mpanelanelana. Noho izany, tsy vitan'ny hoe miasa amin'ny angon-drakitra araka izay hitany fotsiny isika, fa mamehy ny lojika rehetra ao anaty coroutine manokana.

Saingy misy lalitra ao amin'ny menaka: amin'izao fotoana izao dia tohanan'ny compiler efa misy ihany izy ireo, ary tsy ampiharina araka izay tiantsika: ohatra, tsy mbola mendrika ny hampiasa references sy zavatra vonjimaika amin'ny coroutines. Fanampin'izay, misy fameperana sasany momba izay mety ho coroutines, ary tsy tafiditra ao anatin'ity lisitra ity ny fiasa constexpr, mpanorina/mpanimba, ary lehibe.

Noho izany, ny coroutines dia mamaha ampahany manan-danja amin'ny olana amin'ny fahatsoran'ny lojika fanodinana angon-drakitra, saingy mitaky fanatsarana ny fampiharana azy ankehitriny.

fitaovana:

Tetika C++ avy amin'ny Yandex.Taxi, Anton Polukhin

Amin'ny asa arak'asa ataoko, indraindray aho dia tsy maintsy mampihatra zavatra fanampiny: fonon-tanana eo anelanelan'ny interface anatiny sy ny API amin'ny tranomboky sasany, ny fanoratana na ny fanaparitahana. Amin'ity tranga ity, matetika dia tsy ilaina ny fanatsarana fanampiny. Ahoana anefa raha ampiasaina amin'ny sasany amin'ireo tolotra malaza indrindra ao amin'ny RuNet ireo singa ireo? Amin'ny toe-javatra toy izany dia tsy maintsy manodina terabytes isan'ora amin'ny logs irery ianao! Avy eo dia isaina isaky ny milisegondra ary noho izany dia tsy maintsy mampiasa tetika isan-karazany ianao - niresaka momba azy ireo i Anton Polukhin.

Angamba ny ohatra mahaliana indrindra dia ny fampiharana ny lamina 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_; 
};

Amin'ity ohatra ity, aloha aho dia te-hanaisotra ireo rakitra lohatenin'ny tranomboky ivelany - izany dia hanangona haingana kokoa, ary afaka miaro tena amin'ny fifandonana anarana mety hitranga sy ny fahadisoana hafa mitovy amin'izany ianao. 

Eny ary, nafindranay tao amin'ny rakitra .cpp ny #include: mila fanambarana mialoha ny API voafono izahay, ary koa ny std::unique_ptr. Ankehitriny dia manana famatsiam-bola mavitrika sy zavatra hafa tsy mahafinaritra toy ny angona miparitaka manerana ny angon-drakitra marobe sy ny antoka mihena. std::aligned_storage dia afaka manampy amin'izany rehetra izany. 

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

Ny hany olana: mila mamaritra ny habeny sy ny fampifanarahana ho an'ny fonosana tsirairay ianao - andao hataontsika ny modely pimpl miaraka amin'ny paramètre , mampiasa soatoavina tsy misy dikany ary ampio fanamarinana amin'ny mpandrava fa azonay tsara ny zava-drehetra: 

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

Satria efa voafaritra ny T amin'ny fanodinana ny mpandrava, ity kaody ity dia hozaraina araka ny tokony ho izy ary amin'ny dingana fanangonana dia hamoaka ny habe ilaina sy ny sanda fampifanarahana izay tokony hampidirina ho lesoka. Noho izany, amin'ny vidin'ny fanangonam-bokatra iray fanampiny, dia manala ny fizarana mavitrika amin'ny kilasy voafono izahay, manafina ny API ao anaty rakitra .cpp miaraka amin'ny fampiharana, ary mahazo endrika mety kokoa amin'ny caching amin'ny processeur.

Toa tsy dia nahatalanjona loatra ny fandrafetana sy ny famakafakana ary noho izany dia tsy horesahina amin'ity famerenana ity.

Ny slides tatitra dia azo jerena amin'ity rohy manaraka ity: ["C++ tricks avy amin'ny Taxi"]

Teknika maoderina amin'ny fitazonana ny kaody DRY anao, Björn Fahller

Ao amin'ity lahateny ity, Björn Fahller dia mampiseho fomba maro samihafa hiadiana amin'ny lesoka amin'ny fomba fijery miverimberina:

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

Toa mahazatra? Amin'ny alàlan'ny fampiasana teknika C ++ mahery vaika nampidirina tamin'ny fenitra vao haingana, azonao atao ny mampihatra amin'ny fomba kanto ny fiasa mitovy tsy misy sazy fampiasa. Mampitaha:   

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

Raha te handamina fisavana tsy voafaritra ianao dia mila mampiasa avy hatrany ny môdely variadic sy ny fold expression. Andeha hojerentsika fa te hanamarina ny fitovian'ny variables maromaro amin'ny singa state_type an'ny enum isika. Ny zavatra voalohany tonga ao an-tsaina dia ny fanoratana asa mpanampy 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) || ...); 
}

Mandiso fanantenana ity vokatra eo anelanelany ity. Hatreto dia tsy lasa mora vakina ny code:

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

Ny masontsivana môdely tsy misy karazana dia hanampy amin'ny fanatsarana kely ny toe-javatra. Miaraka amin'ny fanampian'izy ireo dia hamindra ireo singa voatanisa ao amin'ny enum amin'ny lisitry ny mari-pamantarana modely izahay: 

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

Amin'ny alàlan'ny fampiasana auto amin'ny paramètre môdely tsy misy karazana (C++17), ny fomba fiasa dia mampitovy tsotra izao ny fampitahana tsy amin'ny singa state_type, fa amin'ny karazana primitive ihany koa izay azo ampiasaina ho masontsivana modely tsy misy karazana:


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

Amin'ny alalan'ireo fanatsarana nifanesy ireo dia tratra ny syntax tsara irina ho an'ny fanamarinana:


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

Amin'ity ohatra ity, ny toro-làlana deduction dia manolotra soso-kevitra momba ny mari-pamantarana môdely tiana ho an'ny mpanangom-bokatra, izay mahafantatra ny karazana tohan-kevitry ny mpamorona. 

Fanampin'izany - mahaliana kokoa. Bjorn dia mampianatra ny fomba fanaovana ankapobe ny kaody vokarina ho an'ny mpandraharaha fampitahana any an-dafin'ny ==, ary avy eo ho an'ny asa tsy misy dikany. Teny an-dalana, ny endri-javatra toy ny no_unique_address attribute (C++ 20) sy ny mari-pamantarana modely amin'ny lambda functions (C++ 20) dia hazavaina amin'ny fampiasana ohatra amin'ny fampiasana. (Eny, mora kokoa ny mitadidy ny lambda syntax - ireo dia mpivady efatra mifanesy amin'ny parentheses amin'ny karazany rehetra.) Ny vahaolana farany amin'ny fampiasana ny asa ho an'ny antsipiriany mpanamboatra dia tena manafana ny fanahiko, tsy lazaina intsony ny teny tuple amin'ny fomban-drazana tsara indrindra amin'ny lambda. kajy.

Amin'ny farany, aza adino ny manasokajy azy:

  • Tsarovy fa ny lambdas dia constexpr maimaim-poana; 
  • Andao ampio ny fandefasana tonga lafatra ary jereo ny syntax ratsy ao aminy mifandraika amin'ny fonosana parameter amin'ny fanakatonana lambda;
  • Andeha isika hanome fahafahana bebe kokoa ho an'ny mpanangona amin'ny fanatsarana miaraka amin'ny noexcept misy fepetra; 
  • Andeha hojerentsika ny famoahana fahadisoana azo takarina kokoa amin'ny maodely noho ny sanda miverina mazava amin'ny lambdas. Izany dia hanery ny compiler hanao fisavana bebe kokoa alohan'ny hiantsoana ny asa maodely - amin'ny dingana fanamarinana karazana. 

Raha mila fanazavana fanampiny dia jereo ny fitaovana famelabelarana: 

Ny fahatsapantsika

Ny fandraisanay anjara voalohany tamin'ny C++ Russia dia tsy hay hadinoina noho ny hamafiny. Nahazo ny fahatsapana ny C++ Russia ho toy ny hetsika tso-po aho, izay saika tsy hita maso ny tsipika eo amin'ny fiofanana sy ny fifandraisana mivantana. Ny zava-drehetra, manomboka amin'ny fihetseham-pon'ny mpandahateny ka hatramin'ny fifaninanana avy amin'ny mpiara-miombon'antoka amin'ny hetsika, dia mandrisika ny fifanakalozan-kevitra mafana. Ny votoatin'ny kaonferansa, ahitana tatitra, dia mirakitra lohahevitra midadasika be ao anatin'izany ny fanavaozana C ++, fanadihadiana momba ny tetikasa lehibe ary ny fiheverana ara-drafitra ideolojika. Saingy tsy rariny raha tsy miraharaha ny singa ara-tsosialy amin'ny hetsika, izay manampy amin'ny fandresena ny sakana amin'ny fiteny tsy mifandray amin'ny C++ ihany.

Misaotra ny mpikarakara ny fihaonambe izahay tamin'ny fahafahana nandray anjara tamin'ny hetsika tahaka izao!
Mety efa nahita ny lahatsoratry ny mpikarakara momba ny lasa, ankehitriny ary ho avin'ny C++ Russia ianao ao amin'ny bilaogy JUG Ru.

Misaotra namaky, ary manantena izahay fa nahasoa ny namerinay ny zava-nitranga!

Source: www.habr.com

Add a comment