C ++ Rusia: carane kedaden

Yen ing awal muter sampeyan ngomong sing ana C ++ kode hanging ing tembok, banjur ing pungkasan iku bound kanggo njupuk sampeyan ing sikil.

Bjarne Stroustrup

Saka 31 Oktober nganti 1 November, konferensi C++ Russia Piter dianakake ing St. Petersburg - salah sawijining konferensi pemrograman skala gedhe ing Rusia, sing diatur dening JUG Ru Group. Pembicara tamu kalebu anggota Komite Standar C ++, pamicara CppCon, penulis buku O'Reilly, lan pengelola proyek kayata LLVM, libc++, lan Boost. Konferensi kasebut ditujokake kanggo pangembang C ++ sing duwe pengalaman sing pengin nggedhekake keahliane lan ngganti pengalaman ing komunikasi langsung. Siswa, mahasiswa pascasarjana lan guru universitas diwenehake diskon sing apik banget.

Edisi konferensi Moskow bakal kasedhiya kanggo ngunjungi ing awal April taun ngarep, nanging ing sawetoro wektu para siswa bakal ngandhani apa sing menarik sing disinaoni ing acara pungkasan. 

C ++ Rusia: carane kedaden

Foto saka album konferensi

О нас

Rong mahasiswa saka Sekolah Tinggi Ekonomi Universitas Riset Nasional - St. Petersburg nggarap postingan iki:

  • Liza Vasilenko minangka mahasiswa sarjana taun 4 sing sinau Basa Pemrograman minangka bagéan saka program Matematika Terapan lan Ilmu Komputer. Sawise kenal karo basa C ++ ing taun pisanan ing universitas, aku banjur entuk pengalaman nggarap basa kasebut liwat magang ing industri kasebut. Semangat kanggo basa pemrograman ing program umum lan fungsional utamane menehi tandha babagan pilihan laporan ing konferensi kasebut.
  • Danya Smirnov minangka mahasiswa taun 1 program master "Pemrograman lan Analisis Data". Nalika isih sekolah, aku nulis masalah Olimpiade ing C ++, banjur piye wae kedadeyan yen basa kasebut terus-terusan muncul ing kegiatan pendidikan lan pungkasane dadi basa kerja utama. Aku mutusake kanggo melu konferensi kanggo nambah kawruh lan uga sinau babagan kesempatan anyar.

Ing newsletter, pimpinan fakultas asring nuduhake informasi babagan acara pendidikan sing ana gandhengane karo spesialisasi kita. Ing September kita weruh informasi babagan C ++ Rusia lan mutusaké kanggo ndhaftar minangka pamireng. Iki pengalaman pisanan kita melu ing konferensi kuwi.

Struktur konferensi

  • Laporan

Sajrone rong dina, para ahli maca 30 laporan, nyakup akeh topik panas: panggunaan fitur basa sing apik kanggo ngatasi masalah sing ditrapake, nganyari basa sing bakal teka sing ana gandhengane karo standar anyar, kompromi ing desain C ++ lan pancegahan nalika nggarap akibate, contone. arsitektur proyek menarik, uga sawetara rincian under-the-hood saka infrastruktur basa. Telung pagelaran njupuk Panggonan bebarengan, paling asring loro ing Rusia lan siji ing Inggris.

  • Zona diskusi

Sawise pidato, kabeh pitakonan sing durung ditakoni lan diskusi sing durung rampung ditransfer menyang wilayah sing wis ditemtokake khusus kanggo komunikasi karo penutur, dilengkapi papan penanda. Cara sing apik kanggo ngilangi istirahat antarane pidato kanthi obrolan sing nyenengake.

  • Dhiskusi kilat lan diskusi informal

Yen sampeyan pengin menehi laporan singkat, sampeyan bisa ndhaptar ing whiteboard ing wayah sore Lightning Dhiskusi lan entuk limang menit wektu kanggo pirembagan bab apa wae ing topik konferensi. Contone, introduksi cepet kanggo sanitizers kanggo C ++ (kanggo sawetara iku anyar) utawa crita bab bug ing generasi gelombang sinus sing mung bisa krungu, nanging ora katon.

Format liyane yaiku diskusi panel "Kanthi Komite Jantung menyang Jantung". Ing panggung ana sawetara anggota panitia standarisasi, ing proyektor ana perapian (resmi - kanggo nggawe atmosfer sing tulus, nanging alesan "amarga EVERYTHING IS ON FIRE" katon luwih lucu), pitakonan babagan standar lan visi umum C ++ , tanpa diskusi technical digawe panas lan holiwars. Pranyata panitia uga ngemot wong urip sing bisa uga ora yakin utawa ora ngerti.

Kanggo penggemar holivars, acara katelu tetep ing kasus kasebut - sesi BOF "Go vs. C ++". We njupuk pacangan Go, pacangan C ++, sadurunge wiwitan sesi padha bebarengan nyiapake 100500 minger ing topik (kaya masalah karo paket ing C ++ utawa lack of generik ing Go), lan banjur padha duwe diskusi nengsemake antarane piyambak lan karo pamirsa, lan pamirsa nyoba mangertos rong sudut pandang bebarengan. Yen holivar wiwit metu saka konteks, moderator campur tangan lan reconcile pihak. Format iki gawe ketagihan: sawetara jam sawise wiwitan, mung setengah saka slide rampung. Pungkasane kudu dicepetake banget.

  • Mitra ngadeg

Mitra konferensi kasebut diwakili ing aula - ing stand padha ngomong babagan proyek saiki, nawakake magang lan lapangan kerja, nganakake kuis lan kompetisi cilik, lan uga raffle hadiah sing apik. Ing wektu sing padha, sawetara perusahaan malah nawakake kanggo ngliwati tahap awal wawancara, sing bisa migunani kanggo wong-wong sing teka ora mung ngrungokake laporan.

Rincian teknis saka laporan

Kita ngrungokake laporan loro dina. Kadhangkala angel milih salah sawijining laporan saka laporan sing padha - kita setuju kanggo pisah lan ijol-ijolan kawruh sing dipikolehi sajrone istirahat. Lan sanajan mangkono, katon akeh sing ditinggalake. Ing kene kita pengin ngomong babagan isi sawetara laporan sing paling menarik

Pangecualian ing C ++ liwat prisma optimizations compiler, Roman Rusyaev

C ++ Rusia: carane kedaden
Geser saka presentasi

Minangka judhul sing disaranake, Roman ndeleng kerja kanthi pengecualian nggunakake LLVM minangka conto. Ing wektu sing padha, kanggo wong-wong sing ora nggunakake Clang ing karyane, laporan kasebut isih bisa menehi sawetara gagasan babagan carane kode kasebut bisa dioptimalake. Iki amarga pangembang kompiler lan perpustakaan standar sing cocog komunikasi karo saben liyane lan akeh solusi sing sukses bisa pas.

Dadi, kanggo nangani pangecualian, sampeyan kudu nindakake akeh perkara: nelpon kode penanganan (yen ana) utawa sumber daya gratis ing tingkat saiki lan muter tumpukan luwih dhuwur. Kabeh iki ndadékaké kanggo kasunyatan sing compiler nambah instruksi tambahan kanggo telpon sing duweni potensi uncalan istiméwa. Mulane, yen pangecualian ora bener diunggahake, program kasebut isih bakal nindakake tumindak sing ora perlu. Supaya piye wae nyuda nduwur sirah, LLVM wis sawetara heuristics kanggo nemtokake kahanan ngendi kode nangani pangecualian ora perlu ditambahake utawa nomer "ekstra" instruksi bisa suda.

Penutur nliti kira-kira selusin lan nuduhake kahanan loro sing mbantu nyepetake eksekusi program, lan sing cara kasebut ora bisa ditrapake.

Mangkono, Roman Rusyaev ndadékaké siswa menyang kesimpulan sing kode ngemot pangecualian penanganan ora tansah bisa dileksanakake karo nul overhead, lan menehi saran ing ngisor iki:

  • nalika ngembangake perpustakaan, kudu nolak pangecualian ing prinsip;
  • yen pangecualian isih perlu, banjur sabisa-bisa kudu nambah noexcept (lan const) modifiers nang endi wae supaya compiler bisa ngoptimalake okehe.

Umumé, penutur ngonfirmasi panemu manawa pangecualian paling apik digunakake kanggo minimal utawa ditinggalake kabeh.

Slide laporan kasedhiya ing link ing ngisor iki: ["Pengecualian C++ liwat lensa optimasi kompiler LLVM"]

Generators, coroutines lan rasa manis otak liyane, Adi Shavit

C ++ Rusia: carane kedaden
Geser saka presentasi

Salah siji saka akeh laporan ing konferensi iki darmabakti kanggo inovasi ing C ++ 20 paweling ora mung kanggo presentation warni, nanging uga kanggo identifikasi cetha masalah ana karo logika Processing koleksi (kanggo daur ulang, callbacks).

Adi Shavit nyorot ing ngisor iki: cara sing kasedhiya saiki ngliwati kabeh koleksi lan ora menehi akses menyang sawetara negara intermediate internal (utawa yen ana panggilan balik, nanging kanthi efek samping sing ora nyenengake, kayata Neraka Callback) . Iku bakal koyone sing ana iterators, nanging malah karo wong-wong mau kabeh ora dadi Gamelan: ora ana entri umum lan metu TCTerms (wiwit → pungkasan versus rbegin → rend lan ing), iku ora cetha suwene kita bakal iterate? Miwiti karo C ++ 20, masalah iki ditanggulangi!

Pilihan pisanan: kisaran. Kanthi mbungkus iterator, kita entuk antarmuka umum kanggo wiwitan lan pungkasan pengulangan, lan uga entuk kemampuan kanggo nyusun. Kabeh iki nggampangake mbangun pipa pangolahan data lengkap. Nanging ora kabeh dadi Gamelan: bagéan saka logika pitungan dumunung nang implementasine saka iterator tartamtu, kang bisa complicate kode kanggo ngerti lan debug.

C ++ Rusia: carane kedaden
Geser saka presentasi

Inggih, kanggo kasus iki, C ++ 20 nambah coroutines (fungsi kang prilaku padha generator ing Python): eksekusi bisa ditundha dening bali sawetara Nilai saiki nalika ngreksa negara penengah. Mangkono, kita entuk ora mung nggarap data sing katon, nanging uga encapsulating kabeh logika ing coroutine tartamtu.

Nanging ana fly ing ointment: ing wayahe padha mung sebagian didhukung dening compiler ana, lan uga ora dileksanakake minangka rapi kaya kita arep: contone, iku durung worth nggunakake referensi lan obyek sak wentoro ing coroutines. Kajaba iku, ana sawetara watesan babagan apa sing bisa dadi coroutine, lan fungsi constexpr, konstruktor / destruktor, lan utama ora kalebu ing dhaptar iki.

Mangkono, coroutine ngrampungake bagean penting saka masalah kanthi kesederhanaan logika pangolahan data, nanging implementasine saiki mbutuhake perbaikan.

Bahan:

C++ trik saka Yandex.Taxi, Anton Polukhin

Ing aktivitas profesional, kadhangkala aku kudu ngleksanakake sejatine sifate tambahan: pambungkus antarane antarmuka internal lan API saka sawetara perpustakaan, logging utawa parsing. Ing kasus iki, biasane ora perlu optimasi tambahan. Nanging apa yen komponen kasebut digunakake ing sawetara layanan sing paling populer ing RuNet? Ing kahanan kaya mengkono, sampeyan kudu ngolah terabyte saben jam log dhewe! Banjur saben milidetik diitung lan mulane sampeyan kudu nggunakake macem-macem trik - Anton Polukhin ngomong babagan iki.

Mbok conto sing paling menarik yaiku implementasi 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_; 
};

Ing conto iki, pisanan aku pengin nyisihake file header saka perpustakaan eksternal - iki bakal ngumpulake luwih cepet, lan sampeyan bisa nglindhungi dhewe saka kemungkinan konflik jeneng lan kesalahan liyane sing padha. 

Oke, kita pindhah #include menyang file .cpp: kita kudu deklarasi maju saka API kebungkus, uga std::unique_ptr. Saiki kita duwe alokasi dinamis lan prekara sing ora nyenengake kaya data sing kasebar ing pirang-pirang data lan nyuda jaminan. std::aligned_storage bisa mbantu kabeh iki. 

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

Masalah mung: kita kudu nemtokake ukuran lan keselarasan kanggo saben pambungkus - ayo gawe cithakan pimpl kanthi paramèter , gunakake sawetara nilai sing sewenang-wenang lan tambahake mriksa ing destruktor sing wis kita duga kanthi bener. : 

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

Wiwit T wis ditetepake nalika ngolah destructor, kode iki bakal diurai kanthi bener lan ing tahap kompilasi bakal ngasilake ukuran sing dibutuhake lan nilai keselarasan sing kudu dilebokake minangka kesalahan. Mangkono, ing biaya siji tambahan roto kompilasi, kita njaluk nyisihaken saka alokasi dinamis kelas kebungkus, ndhelikake API ing file .cpp karo implementasine, lan uga njaluk desain sing luwih cocok kanggo caching dening prosesor.

Logging lan parsing katon kurang nyengsemaken lan mulane ora bakal kasebut ing review iki.

Slide laporan kasedhiya ing link ing ngisor iki: ["C++ trik saka Taksi"]

Teknik modern kanggo njaga kode sampeyan KERING, Björn Fahller

Ing pirembagan iki, Björn Fahller nuduhake sawetara cara sing beda kanggo nglawan cacat gaya saka pemeriksaan kondisi sing bola-bali:

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

Swara akrab? Kanthi nggunakake sawetara C ++ Techniques kuat ngenalaken ing standar anyar, sampeyan bisa elegantly ngleksanakake fungsi padha tanpa paukuman kinerja. mbandhingake:   

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

Kanggo nangani jumlah mriksa sing ora tetep, sampeyan kudu langsung nggunakake template variadic lan ekspresi lempitan. Ayo nganggep yen kita pengin mriksa kesetaraan sawetara variabel menyang unsur state_type enum. Wangsulan: Bab ingkang pisanan sing dipikirake yaiku 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) || ...); 
}

Asil penengah iki nguciwani. Nganti saiki kode kasebut ora bisa diwaca:

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

Parameter cithakan non-jinis bakal mbantu nambah kahanan. Kanthi bantuan, kita bakal nransfer unsur enumerable menyang dhaptar parameter template: 

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

Kanthi nggunakake otomatis ing parameter cithakan non-jinis (C ++ 17), pendekatan kasebut mung umum kanggo mbandhingake ora mung karo unsur state_type, nanging uga karo jinis primitif sing bisa digunakake minangka paramèter cithakan non-jinis:


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

Liwat dandan berturut-turut iki, sintaks lancar sing dikarepake kanggo mriksa bisa digayuh:


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

Ing conto iki, panuntun deduksi serves kanggo suggest paramèter cithakan struktur sing dipengini kanggo compiler, sing ngerti jinis argumen konstruktor. 

Luwih - luwih menarik. Bjorn mulang carane generalize kode asil kanggo operator comparison ngluwihi ==, lan banjur kanggo operasi kasepakatan. Sadawane dalan, fitur kayata atribut no_unique_address (C ++ 20) lan paramèter template ing fungsi lambda (C ++ 20) diterangake nggunakake conto panggunaan. (Ya, saiki sintaks lambda luwih gampang dieling-eling - iki minangka papat pasangan kurung sing terus-terusan saka kabeh jinis.) Solusi pungkasan nggunakake fungsi minangka rincian konstruktor pancen nyenengake nyawaku, ora kanggo sebutno ekspresi tuple ing tradhisi lambda sing paling apik. kalkulus.

Ing pungkasan, aja lali kanggo polish munggah:

  • Elinga yen lambdas iku constexpr gratis; 
  • Ayo ditambahake maju sing sampurna lan deleng sintaks sing ala ing hubungane karo paket parameter ing penutupan lambda;
  • Ayo menehi compiler luwih kesempatan kanggo optimizations karo noexcept kondisional; 
  • Ayo ngurus output kesalahan sing luwih dingerteni ing template amarga nilai bali sing jelas saka lambdas. Iki bakal meksa compiler kanggo nindakake liyane mriksa sadurunge fungsi cithakan bener disebut - ing tataran mriksa jinis. 

Kanggo rincian, mangga deleng materi kuliah: 

Kesan kita

Partisipasi pisanan kita ing C ++ Rusia ora bisa dilalekake amarga intensitase. Aku entuk kesan saka C ++ Rusia minangka acara sing tulus, ing ngendi garis antarane latihan lan komunikasi langsung meh ora katon. Kabèh, saka swasana pamicara nganti lomba saka mitra acara, bisa kanggo diskusi panas. Isi konferensi, kalebu laporan, nyakup macem-macem topik kalebu inovasi C ++, studi kasus proyek gedhe lan pertimbangan arsitektur ideologis. Nanging ora adil kanggo nglirwakake komponen sosial acara kasebut, sing mbantu ngatasi alangan basa sing ana hubungane ora mung karo C ++.

Kita matur nuwun marang panitia konferensi kanggo kesempatan kanggo melu ing acara kasebut!
Sampeyan bisa uga wis ndeleng kiriman panitia babagan kepungkur, saiki lan masa depan C++ Rusia ing blog JUG Ru.

Matur nuwun kanggo maca, lan kita ngarep-arep retelling acara iki migunani!

Source: www.habr.com

Add a comment