Dalam program bersama ITMO dan JetBrains
Master , kami meminta siswa yang dikirim ke konferensi untuk menulis laporan dengan tinjauan laporan.
Kami menerbitkan salah satu dari laporan ini tentang konferensi C ++ Russia Piter 2019. Penulis adalah mahasiswa tahun ke-2 Artyom Khoroshev.

Pada awal November, saya menghadiri konferensi cpp-russia-piter, di bawah ini saya akan berbicara tentang laporan yang saya ingat.
Roman Rusyaev: Pengecualian C ++ melalui prisma optimisasi kompiler
Sebuah laporan menarik di mana pembicara pada contoh LLVM berbicara tentang pengecualian nol biaya dalam C ++ modern.
LLVM IR menyajikan program sebagai grafik aliran kontrol. Di dalam simpul grafik terdapat blok instruksi yang harus diikuti. Di akhir setiap blok, ada terminator yang mentransfer kontrol ke blok berikutnya. Terminator dapat berupa transisi bersyarat ke blok lain, instruksi pengembalian, atau instruksi pemanggilan khusus, yang memiliki semantik memanggil fungsi, dan jika berhasil, mentransfer aliran kontrol ke satu blok, dan dalam kasus pengecualian, menunjukkan blok yang Anda inginkan untuk memprosesnya. Instruksi dalam sebuah blok memiliki properti bahwa jika kami menekan blok, kami akan menjalankan semua instruksi, atau kami tidak akan jatuh ke dalam blok ini sama sekali. Ada optimisasi yang hanya dapat bekerja dalam satu blok. Dalam kasus blok kecil, mereka akan memiliki konteks yang lebih kecil, akibatnya lebih buruk untuk melakukan optimasi.
Pembicara berbicara tentang bagaimana kompiler modern dapat mengonversi pernyataan aktif ke pernyataan panggilan, yang tidak lagi terminal, dan, sebagai hasilnya, memberi kompiler lebih banyak ruang untuk optimisasi. Tetapi, agar tidak bergantung pada kompiler, Anda dapat menulis sendiri fungsi noexcept (jika ini benar) untuk memastikan bahwa kompiler akan melakukan semua optimasi.
(slide laporan)Maxim Khizhinsky: Perumahan kelas kenyamanan untuk aktor dan penangan
Pembicara menetapkan tujuan untuk menyingkirkan sejumlah masalah yang terkait dengan pemrograman paralel:
- data bersama
- pergantian konteks,
- sinkronisasi
- Penciptaan aliran dengan cepat untuk kebutuhan jangka pendek.
Akibatnya, pembicara menyarankan untuk memecah programnya menjadi komponen, yang masa pakainya akan sama dengan masa pakai program, dan memasukkan komponen ke dalam "apartemen", yang jumlahnya harus sama dengan jumlah utas. Komponen itu sendiri, sebagai akibatnya, adalah single-threaded, dan komunikasi antara komponen harus terjadi melalui pesan yang lewat. Saya setuju bahwa ini menyelesaikan masalah, tetapi dengan mengorbankan semua penyesuaian program kami, kami harus melakukannya pada saat kompilasi. Minimal, perlu pada saat kompilasi untuk mendistribusikan komponen secara merata di antara "apartemen", yang selanjutnya mencegah sistem dari penyeimbangan kembali tergantung pada beban. Akibatnya, menurut saya, solusinya sendiri tidak terlihat cukup fleksibel.
(slide laporan)Nikolay Beloborodov: Penggunaan slab-dialokasikan pada aplikasi jaringan yang sangat dimuat
Nama itu berbicara sendiri. Pembicara memberi tahu bagaimana mereka secara signifikan meningkatkan kinerja sistem menggunakan
pengalokasi slab . Pengalokasi slab beroperasi pada beberapa entitas:
- slab adalah bagian memori yang berdekatan (biasanya berukuran tetap) yang dibagi menjadi beberapa bagian dengan ukuran yang sama. Area ini digunakan untuk menyimpan objek dengan ukuran yang sama,
- cache - daftar slab dengan split yang sama,
- pengalokasi slab - satu set cache.
Berkat konstruksi ini, objek dengan ukuran yang sama disimpan secara lokal. Deallokasi dirancang sebagai tanda bahwa situs tertentu lemah dan dapat digunakan kembali. Ini menghindari fragmentasi memori.
Dari definisi slab pengalokasi ini, menjadi jelas bahwa itu sangat cocok untuk menyoroti pelepasan objek yang ukurannya terletak pada interval terbatas. Misalnya, mengalokasikan ukuran yang lebih besar dan lebih besar setiap kali, cache baru akan dibuat, cache lama tidak akan digunakan kembali.
Pembicara mengatakan bahwa karena ini mereka harus meninggalkan beberapa wadah, demi yang lain. Sebagai contoh, vektor diganti dengan daftar, peta hash dengan pohon, tetapi bagaimanapun, keuntungan dalam kinerja masih diperoleh.
(slide laporan)Anton Polukhin: Trik Taksi C ++
Laporan dari Anton Polukhin selalu menarik, dan solusi yang dia tawarkan terlihat bagus. Kali ini, Anton menunjukkan bagaimana pola jerawat dapat diperbaiki dalam hal alokasi dinamis. Untuk melakukan ini, Anda perlu menempatkan repositori untuk objek implementasi di objek itu sendiri. Biarkan saya mengingatkan Anda bahwa pola jerawat klasik adalah sebagai berikut:
Kami ingin menyingkirkan alokasi dinamis, untuk ini kami akan menyiapkan tempat terlebih dahulu langsung di objek Foo:
Metode ini tidak akan berfungsi, karena kami tidak memiliki informasi lengkap tentang tipe Foo_impl di Foo.h dan kesalahan kompilasi akan diterima. Satu-satunya solusi yang tersisa adalah menebak ukuran penyimpanan terlebih dahulu.
Tetapi Anda perlu menambahkan tanda centang bahwa ukurannya masih benar. Ini perlu, karena upaya untuk menempatkan objek dalam buffer yang tidak sesuai untuk itu adalah UB.
Kami melakukan pemeriksaan pada file cpp, dan jika ada sesuatu yang tidak benar, kami akhiri dengan kesalahan kompilasi, dan mencetak ukuran struktur yang benar sehingga programmer dapat menebak dari upaya kedua.
Anton menunjukkan cara membuat pustaka serialisasi dalam berbagai format menjadi nyaman, hanya saja tidak melupakan fitur ADL: jika ada parameter template untuk argumen fungsi, fungsi tersebut akan dicari dalam ruang nama parameter argumen ini.
(slide laporan)Eric Niebler: Abstraksi pemersatu untuk async dalam C ++
Laporan yang menarik, yang membahas masalah abstraksi asinkron dalam standar bahasa yang ada: mengapa masa depan dan janji lambat, dan bisakah kita mendesain perpustakaan sedemikian rupa untuk menghindari overhead ini. Para pengembang facebook tampaknya memiliki solusi yang layak
https://github.com/facebookexperimental/libunifex(slide laporan)Dmitry Kozhevnikov dan Andrey Davydov: Dua laporan tentang modul
Program memiliki dua laporan berturut-turut tentang modul. Setelah mendengarkan kedua laporan, menjadi jelas bahwa modul-modul tersebut belum siap untuk digunakan. Ini sedikit membuat saya kesal, karena saya tidak tertarik pada prinsipnya bagaimana fitur baru bahasa ini diimplementasikan, dan saya berpikir bahwa C ++ 20 akan keluar dan siap untuk digunakan segera. Sayangnya, ternyata tidak demikian.
(slide laporan:
1 ,
2 )
Kesimpulan
Konferensi yang lalu senang dengan contoh-contoh menarik menggunakan fitur-fitur terkenal dari bahasa tersebut. Sejumlah besar laporan tentang chip dari standar berikut - C ++ 20. Ini, tentu saja, sangat berguna untuk semua pengembang C ++.