C ++ Rusia: kumaha kajadian

Lamun di awal muter anjeun nyebutkeun yén aya C ++ kode nongkrong dina témbok, lajeng dina tungtungna eta kabeungkeut némbak anjeun dina suku.

Bjarne Stroustrup

Ti 31 Oktober nepi ka 1 Nopémber, konferensi C++ Rusia Piter dilaksanakeun di St. Petersburg - salah sahiji konferensi programming skala badag di Rusia, diayakeun ku JUG Ru Grup. Panyatur tamu kalebet anggota Komite Standar C ++, panyatur CppCon, pangarang buku O'Reilly, sareng pangropéa proyék sapertos LLVM, libc ++, sareng Boost. Konférénsi ieu ditujukeun pikeun pamekar C ++ anu ngalaman anu hoyong langkung jero kaahlian sareng tukeur pangalaman dina komunikasi langsung. Siswa, mahasiswa pascasarjana sareng guru universitas disayogikeun diskon anu saé pisan.

Édisi Moscow konferensi bakal sadia pikeun didatangan salaku awal April taun hareup, tapi di Samentara éta siswa urang bakal ngabejaan Anjeun naon hal metot aranjeunna diajar di acara panungtungan. 

C ++ Rusia: kumaha kajadian

Poto ti albeum konferensi

ngeunaan urang

Dua mahasiswa ti National Research University Higher School of Economics - St. Petersburg dikeureuyeuh pos ieu:

  • Liza Vasilenko mangrupikeun mahasiswa sarjana taun 4 anu diajar Basa Pemrograman salaku bagian tina program Matematika Terapan sareng Ilmu Komputer. Sanggeus jadi acquainted jeung basa C ++ dina taun munggaran kuring di universitas, abdi salajengna miboga pangalaman gawé bareng eta ngaliwatan internships di industri. Gairah pikeun basa pamrograman sacara umum sareng program fungsional khususna tinggalkeun tandana dina pilihan laporan dina konperénsi éta.
  • Danya Smirnov nyaéta murid taun 1 tina program master "Programming and Data Analysis". Nalika masih sakola, kuring nyerat masalah Olimpiade dina C ++, teras kumaha waé kajadian yén basa éta terus-terusan muncul dina kagiatan pendidikan sareng ahirna janten basa kerja utama. Kuring mutuskeun pikeun ilubiung dina konférénsi pikeun ngaronjatkeun pangaweruh kuring sarta ogé diajar ngeunaan kasempetan anyar.

Dina buletin, pimpinan fakultas sering ngabagi inpormasi ngeunaan acara pendidikan anu aya hubunganana sareng spesialisasi urang. Dina bulan Séptember urang nempo informasi ngeunaan C ++ Rusia jeung mutuskeun pikeun ngadaptar salaku listeners. Ieu mangrupikeun pangalaman munggaran urang milu dina konperénsi sapertos kitu.

Struktur konferensi

  • Laporan

Salila dua poé, para ahli maca 30 laporan, ngawengku loba jejer panas: pamakéan akalna fitur basa pikeun ngajawab masalah dilarapkeun, apdet basa upcoming dina sambungan jeung standar anyar, compromises dina C ++ rarancang jeung precautions nalika gawé bareng konsékuansi maranéhanana, conto. arsitéktur proyék metot, kitu ogé sababaraha rinci under-the-hood tina infrastruktur basa. Tilu pintonan lumangsung sakaligus, paling sering dua dina basa Rusia jeung hiji dina basa Inggris.

  • Zona diskusi

Saatos biantara, sadaya patarosan anu teu ditaroskeun sareng diskusi anu teu acan réngsé dialihkeun ka daérah anu ditunjuk khusus pikeun komunikasi sareng panyatur, dilengkepan ku papan spidol. Cara anu saé pikeun ngajauhan istirahat antara pidato sareng paguneman anu pikaresepeun.

  • Talks kilat jeung diskusi informal

Upami anjeun hoyong masihan laporan pondok, anjeun tiasa ngadaptarkeun dina whiteboard pikeun Malem kilat Talk jeung meunang lima menit waktu ngobrol ngeunaan nanaon dina topik konferensi. Contona, hiji bubuka gancang sanitizers pikeun C ++ (pikeun sababaraha éta anyar) atawa carita ngeunaan bug dina generasi gelombang sinus nu ngan bisa kadéngé, tapi teu katempo.

Format sanésna nyaéta diskusi panel "Kalayan Komite Jantung ka Jantung". Di panggung aya sababaraha anggota panitia standardisasi, dina projector mangrupa hawu (resmi - pikeun nyieun atmosfir ikhlas, tapi alesan "sabab sagalana aya dina seuneu" sigana funnier), patarosan ngeunaan standar jeung visi umum C++. , tanpa diskusi teknis dipanaskeun jeung holiwars. Tétéla éta panitia ogé ngandung jalma hirup anu bisa jadi teu sagemblengna yakin kana hiji hal atawa bisa jadi teu nyaho hiji hal.

Pikeun peminat holivars, acara katilu tetep dina kasus - sési BOF "Go vs. C ++". Kami nyandak pencinta Go, pencinta C ++, sateuacan ngamimitian sési, aranjeunna babarengan nyiapkeun 100500 slide dina topik (sapertos masalah sareng pakét dina C ++ atanapi kurangna generik di Go), teras aranjeunna gaduh diskusi anu meriah diantara aranjeunna sareng kalawan panongton, sarta panongton nyoba ngartos dua sudut pandang sakaligus. Lamun holivar dimimitian kaluar tina konteks, moderator intervenes na reconciles pihak. format ieu adiktif: sababaraha jam sanggeus mimiti, ngan satengah tina slides réngsé. tungtungna kedah greatly gancangan.

  • Mitra nangtung

Mitra konperénsi éta diwakilan di aula - di lapak aranjeunna nyarioskeun ngeunaan proyék-proyék ayeuna, nawiskeun magang sareng padamelan, ngayakeun kuis sareng kompetisi alit, sareng ogé raffled hadiah anu saé. Dina waktos anu sami, sababaraha perusahaan malah nawiskeun ngaliwat tahap awal wawancara, anu tiasa mangpaat pikeun anu sumping henteu ngan ukur ngadangukeun laporan.

rinci teknis ngeunaan laporan

Urang listened kana laporan duanana poé. Kadang-kadang hese milih hiji laporan ti anu paralel - kami sapuk pikeun ngabagi sareng tukeur pangaweruh anu dimeunangkeun nalika istirahat. Jeung sanajan kitu, sigana nu loba ditinggalkeun kaluar. Di dieu urang hoyong ngobrol ngeunaan eusi sababaraha laporan nu urang kapanggih paling metot

Iwal dina C ++ ngaliwatan prisma optimizations compiler, Roman Rusyaev

C ++ Rusia: kumaha kajadian
Geser ti presentasi

Sakumaha judulna nunjukkeun, Romawi ningali damel sareng pengecualian nganggo LLVM salaku conto. Dina waktos anu sami, pikeun anu henteu nganggo Clang dina padamelan na, laporan éta masih tiasa masihan sababaraha ide kumaha kode éta berpotensi dioptimalkeun. Hal ieu jadi sabab pamekar compiler jeung perpustakaan standar pakait saling komunikasi jeung loba solusi suksés bisa coincide.

Janten, pikeun nanganan pengecualian, anjeun kedah ngalakukeun seueur hal: nelepon kodeu penanganan (upami aya) atanapi sumberdaya gratis dina tingkat ayeuna sareng puterkeun tumpukan anu langkung luhur. Sadaya ieu nyababkeun kanyataan yén kompiler nambihan petunjuk tambahan pikeun telepon anu berpotensi ngalungkeun pengecualian. Ku alatan éta, lamun pangecualian teu sabenerna diangkat, program bakal tetep ngalakukeun tindakan teu perlu. Dina raraga kumaha bae ngurangan overhead, LLVM boga sababaraha heuristik pikeun nangtukeun kaayaan dimana kode penanganan iwal teu perlu ditambahkeun atawa jumlah "tambahan" parentah bisa ngurangan.

Speaker examines ngeunaan belasan di antarana sarta nembongkeun duanana kaayaan dimana aranjeunna ngabantu nyepetkeun palaksanaan program, sarta maranéhanana dimana métode ieu teu lumaku.

Ku kituna, Roman Rusyaev ngabalukarkeun siswa kana kacindekan yén kode nu ngandung penanganan iwal teu salawasna bisa dieksekusi kalawan nol overhead, sarta méré nasehat handap:

  • nalika ngembangkeun perpustakaan, éta patut abandoning iwal prinsipna;
  • lamun iwal masih diperlukeun, lajeng sabisana sia nambahkeun noexcept (jeung const) modifiers madhab ku kituna compiler bisa ngaoptimalkeun saloba mungkin.

Sacara umum, panyatur ngonfirmasi pandangan yén pangecualian paling hadé dianggo pikeun minimum atanapi ditinggalkeun sadayana.

Slide laporan sayogi dina tautan ieu: ["C ++ pengecualian ngaliwatan lensa LLVM compiler optimizations"]

Generators, coroutines jeung rasa amis otak-unrolling séjén, Adi Shavit

C ++ Rusia: kumaha kajadian
Geser ti presentasi

Salah sahiji loba laporan dina konferensi ieu dedicated ka inovasi dina C ++ 20 éta memorable henteu ngan keur presentasi warni na, tapi ogé pikeun idéntifikasi jelas na masalah aya jeung logika processing kempelan (pikeun loop, callbacks).

Adi Shavit nyorotkeun ieu: metodeu anu ayeuna sayogi ngalangkungan sadayana koleksi sareng henteu masihan aksés ka sababaraha kaayaan panengah internal (atanapi aranjeunna ngalakukeun dina kasus callbacks, tapi kalayan sajumlah ageung efek samping anu teu pikaresepeun, sapertos Callback Hell). . Ieu bakal sigana nu aya iterators, tapi sanajan maranehna sagalana teu jadi lemes: euweuh asupna umum tur kaluar titik (mimiti → tungtung versus rbegin → rend jeung saterusna), teu jelas sabaraha lila urang bakal iterate? Dimimitian ku C ++ 20, masalah ieu direngsekeun!

Pilihan kahiji: rentang. Ku wrapping iterators, urang meunang hiji panganteur umum pikeun awal jeung ahir hiji Iteration, sarta kami ogé meunang kamampuhan pikeun nyusun. Sadaya ieu ngagampangkeun ngawangun jalur pipa ngolah data anu lengkep. Tapi teu sagalana geus jadi lemes: bagian tina logika itungan lokasina di jero palaksanaan hiji iterator husus, nu bisa ngahesekeun kode ngartos tur debug.

C ++ Rusia: kumaha kajadian
Geser ti presentasi

Nya, pikeun hal ieu, C ++ 20 nambihan coroutines (fungsi anu paripolahna sami sareng generator di Python): palaksanaan tiasa ditunda ku ngabalikeun sababaraha nilai ayeuna bari ngajaga kaayaan panengah. Ku kituna, urang ngahontal teu ukur gawé bareng data sakumaha nembongan, tapi ogé encapsulating sakabeh logika jero hiji coroutine husus.

Tapi aya laleur dina salep: dina momen aranjeunna ngan sawaréh dirojong ku compiler aya, sarta ogé teu dilaksanakeun sakumaha rapih sakumaha urang hoyong: contona, teu acan patut ngagunakeun rujukan jeung objék samentara dina coroutines. Tambih Deui, aya sababaraha larangan dina naon bisa coroutines, sarta fungsi constexpr, konstruktor / destructors, sarta utama teu kaasup dina daptar ieu.

Ku kituna, coroutines ngajawab bagian signifikan tina masalah jeung kesederhanaan logika processing data, tapi palaksanaan maranéhanana ayeuna merlukeun perbaikan.

Bahan:

C++ trik ti Yandex.Taxi, Anton Polukhin

Dina kagiatan profésional kuring, sakapeung kuring kudu nerapkeun hal murni bantu: wrapper antara panganteur internal tur API sababaraha perpustakaan, logging atanapi parsing. Dina hal ieu, biasana henteu peryogi optimasi tambahan. Tapi kumaha upami komponén ieu dianggo dina sababaraha jasa anu pang populerna di RuNet? Dina kaayaan kitu, anjeun kedah ngolah terabytes per jam log nyalira! Teras unggal millidetik diitung sareng ku kituna anjeun kedah nganggo sababaraha trik - Anton Polukhin nyarioskeun aranjeunna.

Panginten conto anu paling pikaresepeun nyaéta palaksanaan pola 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_; 
};

Dina conto ieu, mimitina abdi hoyong miceun file lulugu perpustakaan éksternal - ieu bakal compile gancang, sarta anjeun bisa ngajaga diri tina kamungkinan konflik ngaran jeung kasalahan sarupa lianna. 

Oké, urang dipindahkeun #include kana file .cpp: urang kudu maju-deklarasi tina API dibungkus, kitu ogé std::unique_ptr. Ayeuna kami gaduh alokasi dinamis sareng hal-hal anu teu pikaresepeun sapertos data anu sumebar dina sakumpulan data sareng ngirangan jaminan. std::aligned_storage tiasa ngabantosan sadayana ieu. 

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

Hiji-hijina masalah: urang kedah netepkeun ukuran sareng alignment pikeun unggal bungkus - hayu urang ngadamel template pimpl kami kalayan parameter , nganggo sababaraha nilai sawenang-wenang sareng tambahkeun cek ka destructor anu urang tebak sadayana leres. : 

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

Kusabab T parantos ditetepkeun nalika ngolah destructor, kode ieu bakal diuraikan leres sareng dina tahap kompilasi éta bakal ngahasilkeun ukuran anu diperyogikeun sareng nilai alignment anu kedah diasupkeun salaku kasalahan. Ku kituna, dina biaya hiji ngajalankeun kompilasi tambahan, urang meunang leupas tina alokasi dinamis tina kelas dibungkus, nyumputkeun API dina file .cpp kalawan palaksanaan, sarta ogé meunang desain anu leuwih cocog pikeun cache ku processor.

Logging na parsing seemed kirang impressive sahingga moal disebutkeun dina review ieu.

Slide laporan sayogi dina tautan ieu: ["C++ trik tina Taksi"]

Téhnik modern pikeun ngajaga kode anjeun KERING, Björn Fahller

Dina obrolan ieu, Björn Fahller nunjukkeun sababaraha cara pikeun merangan cacad gaya tina pamariksaan kaayaan anu diulang:

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

Sora akrab? Ku ngagunakeun sababaraha téhnik C ++ kuat diwanohkeun dina standar panganyarna, Anjeun elegantly tiasa nerapkeun pungsi nu sarua tanpa pinalti kinerja. Bandingkeun:   

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

Pikeun nanganan sajumlah cek anu henteu tetep, anjeun kedah langsung nganggo template variadic sareng ekspresi lipatan. Hayu urang nganggap yen urang hoyong pariksa sarua sababaraha variabel kana elemen state_type enum urang. Hal kahiji anu aya dina pikiran nyaéta nulis fungsi helper 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) || ...); 
}

Hasil panengah ieu nguciwakeun. Sajauh kodeu henteu janten langkung dibaca:

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

Parameter template non-tipe bakal ngabantu ningkatkeun kaayaan saeutik. Kalayan bantosanana, urang bakal nransferkeun elemen enumerable tina enum kana daptar parameter template: 

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

Ku ngagunakeun otomatis dina parameter template non-tipe (C ++ 17), pendekatan saukur generalizes mun ngabandingkeun teu ukur mibanda elemen state_type, tapi ogé jeung tipe primitif nu bisa dipaké salaku parameter template non-tipe:


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

Ngaliwatan perbaikan berturut-turut ieu, sintaksis lancar anu dipikahoyong pikeun cék kahontal:


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

Dina conto ieu, Panungtun deduksi boga fungsi pikeun nyarankeun parameter template struktur nu dipikahoyong pikeun compiler nu, nu terang jenis argumen constructor. 

Salajengna - leuwih metot. Bjorn ngajarkeun kumaha carana generalize kodeu hasilna pikeun operator ngabandingkeun saluareun ==, lajeng pikeun operasi sawenang. Sapanjang jalan, fitur sapertos atribut no_unique_address (C ++ 20) sareng parameter template dina fungsi lambda (C ++ 20) dipedar nganggo conto pamakean. (Leres, ayeuna sintaksis lambda malah langkung gampang diinget - ieu mangrupikeun opat pasang kurung padeukeut tina sagala jinis.) Solusi ahir ngagunakeun fungsi salaku detil konstruktor leres-leres nyegerkeun jiwa kuring, sanés deui ekspresi tuple dina tradisi anu pangsaéna tina lambda. kalkulus.

Dina tungtungna, ulah poho pikeun ngagosok éta:

  • Inget yén lambdas téh constexpr haratis; 
  • Hayu urang tambahkeun diteruskeun sampurna jeung kasampak di sintaksis awon na dina hubungan jeung pak parameter dina panutupanana lambda;
  • Hayu urang masihan kompiler leuwih kasempetan pikeun optimizations kalawan noexcept kondisional; 
  • Hayu urang jaga kaluaran kasalahan anu langkung kaharti dina témplat berkat nilai balik anu eksplisit tina lambdas. Ieu bakal maksa kompiler pikeun ngalakukeun langkung seueur pamariksaan sateuacan fungsi citakan leres-leres disebut - dina tahap mariksa jinis. 

Pikeun detil, mangga tingal bahan ceramah: 

Tayangan urang

Partisipasi munggaran urang dina C ++ Rusia éta memorable pikeun inténsitas na. Kuring meunang gambaran ngeunaan C ++ Rusia salaku acara ikhlas, dimana garis antara latihan jeung komunikasi hirup ampir imperceptible. Sagalana, ti wanda panyatur nepi ka pasanggiri ti mitra acara, merenah pikeun diskusi panas. Eusi konférénsi, anu diwangun ku laporan, nyertakeun rupa-rupa topik anu cukup lega kalebet inovasi C ++, studi kasus proyék ageung sareng pertimbangan arsitéktur ideologis. Tapi bakal adil mun malire komponén sosial tina acara, nu mantuan nungkulan halangan basa dina hubungan teu ukur C ++.

Urang hatur panitia konferensi pikeun kasempetan pikeun ilubiung dina acara saperti!
Anjeun panginten parantos ningali postingan panitia ngeunaan jaman baheula, ayeuna sareng masa depan C++ Rusia dina blog JUG Ru.

Hatur nuhun pikeun maca, sarta kami miharep retelling acara urang éta mantuan!

sumber: www.habr.com

Tambahkeun komentar