Afai i le amataga o le taʻaloga e te fai mai o loʻo i ai le C ++ code o loʻo tautau i luga o le puipui, ona oʻo atu lea i le iʻuga ua noatia e fana oe i le vae.
Bjarne Stroustrup
Mai ia Oketopa 31 ia Novema 1, na faia ai le C++ Russia Piter conference i St. Petersburg - o se tasi o fonotaga tele polokalame i Rusia, faʻatulagaina e le JUG Ru Group. O failauga asiasi e aofia ai sui o le C++ Standards Committee, CppCon speakers, O'Reilly book authors, ma le tausiaina o galuega faatino e pei ole LLVM, libc++, ma le Boost. O le fonotaga e faʻatatau i le poto masani C++ atiaʻe o loʻo manaʻo e faʻalolotoina o latou tomai ma fefaʻasoaaʻi aafiaga i fesoʻotaʻiga ola. Tamaiti a'oga, tamaiti a'oga fa'au'u ma faia'oga iunivesete ua tu'uina atu i ai fa'aitiitiga manaia tele.
O le lomiga a Moscow o le konafesi o le a avanoa e asiasi i le amataga o Aperila i le tausaga a sau, ae i le taimi nei o le a taʻu atu e a matou tamaiti aoga ia te oe mea manaia na latou aʻoaʻoina i le mea mulimuli na tupu.

Ata mai
E uiga ia i tatou
E toalua tamaiti aoga mai le National Research University Higher School of Economics - St. Petersburg sa galulue i lenei pou:
- Liza Vasilenko o se 4th tausaga i lalo o le tamaititi aʻoga o loʻo aʻoaʻoina Gagana Polokalama o se vaega o le Applied Mathematics and Computer Science program. Ina ua ou masani i le gagana C ++ i loʻu tausaga muamua i le iunivesite, na ou maua ai le poto masani e galue ai e ala i galuega faataitai i le alamanuia. O loʻu tuʻinanau mo gagana faʻapolokalame i polokalame lautele ma faʻatinoga faʻapitoa na tuʻu ai lona faʻailoga i le filifilia o lipoti i le konafesi.
- Danya Smirnov o se tamaititi aʻoga 1st tausaga o le polokalame a le matai "Polokalame ma Suʻesuʻega Faʻamaumauga". A o i ai pea i le aʻoga, sa ou tusia faafitauli o le Olimipeka i le C ++, ona tupu ai lea o le gagana e masani ona sau i gaoioiga faʻaleaʻoaʻoga ma mulimuli ane avea ma gagana autu galue. Sa ou filifili e auai i le konafesi e faaleleia atili ai lou malamalama ma aoao foi e uiga i avanoa fou.
I le nusipepa, e masani ona faʻasoa e le taʻitaʻi aʻoaʻoga faʻamatalaga e uiga i mea tau aʻoaʻoga e fesoʻotaʻi ma la tatou tomai faʻapitoa. Ia Setema na matou vaʻaia faʻamatalaga e uiga i C ++ Rusia ma filifili e lesitala e avea ma tagata faʻalogo. O le matou aafiaga muamua lenei i le auai i ia konafesi.
Faiga o konafesi
Lipoti
I le gasologa o aso e lua, na faitau ai e le au atamamai lipoti e 30, e aofia ai le tele o mataupu vevela: faʻaogaina faʻapitoa o gagana e foia ai faʻafitauli faʻafitauli, faʻafouina gagana fou e fesoʻotaʻi ma le tulaga fou, fetuutuunai i le C ++ mamanu ma puipuiga pe a galulue ma o latou taunuuga, faʻataʻitaʻiga o fa'ata'ita'iga mata'ina o galuega fa'atino, fa'apea fo'i ma nisi fa'amatalaga i lalo ole fa'aulufalega ole gagana. E tolu faafiafiaga na faia i le taimi e tasi, e masani ona lua i le gagana Rusia ma le tasi i le Igilisi.
Sone o talanoaga
Ina ua maeʻa le tautalaga, o fesili uma e leʻi fesiligia ma talanoaga e leʻi maeʻa na faʻafeiloaʻi i nofoaga faʻapitoa mo fesoʻotaʻiga ma failauga, faʻapipiʻiina i laupapa faʻailoga. O se auala lelei e fa'agata ai le va o lauga ma se talanoaga manaia.
Lauga Uila ma talanoaga le aloaia
Afai e te manaʻo e tuʻuina atu se lipoti puupuu, e mafai ona e lesitala i luga o le laupapa paepae mo le afiafi o le Uila Talanoa ma maua le lima minute o le taimi e talanoa ai i soʻo se mea i le autu o le konafesi. Mo se faʻataʻitaʻiga, o se faʻamatalaga vave i mea faʻamama mo C ++ (mo nisi e fou) poʻo se tala e uiga i se pusa i le gaosiga o galu e mafai ona faʻalogoina, ae le o vaʻaia.
O le isi faatulagaga o le talanoaga faavaega “Ma le Loto i le Loto Komiti.” I luga o le tulaga o loʻo i ai nisi o sui o le komiti faʻatulagaina, i luga o le masini faʻapipiʻi o se afi afi (faʻapitoa - e fatu ai se siosiomaga faʻamaoni, ae o le mafuaʻaga "ona o mea uma o loʻo i luga o le afi" e foliga mai e sili atu ona malie), fesili e uiga i le tulaga masani ma le vaʻaiga lautele o C ++ , e aunoa ma ni felafolafoa'iga fa'atekinisi vevela ma fa'asalalauga. Na aliali mai o le komiti o loʻo i ai foi tagata ola atonu e le o mautinoa atoatoa i se mea pe le iloa foi se mea.
Mo tagata fiafia o holivars, o le mea lona tolu na tumau pea i luga o le mataupu - le BOF session "Go vs. C++". Matou te ave se Go lover, se C++ lover, aʻo leʻi amataina le vasega latou te saunia faʻatasi 100500 slides i luga o se autu (pei o faʻafitauli i afifi i C ++ poʻo le leai o ni generics i Go), ona latou faia lea o se talanoaga olaola i latou lava ma ma le aofia, ma taumafai le aofia e malamalama i manatu e lua i le taimi e tasi . Afai e amata se holivar i fafo atu o le talaaga, e fa'alavelave le fa'afoe ma toe fa'alelei vaega. O lenei faatulagaga e fai ma vaisu: i ni nai itula talu ona amata, na'o le afa o fa'ase'e na mae'a. O le iuga sa tatau ona matua faatelevaveina.
Tutu le paaga
O pa’aga o le fonotaga sa fai ma sui i totonu o le maota-i luga o tulaga sa latou talanoa ai e uiga i galuega o lo’o i ai nei, ofo atu galuega fa’atino ma galuega, faia o su’ega ma tauvaga laiti, ma se’i fa’ailoga matagofie. I le taimi lava e tasi, o nisi kamupani na ofo atu e alu i le amataga o faʻatalanoaga, lea e mafai ona aoga mo i latou na o mai e le gata e faʻalogo i lipoti.
Fa'amatalaga fa'apitoa o lipoti
Sa matou faalogologo i lipoti i aso uma e lua. I nisi o taimi sa faigata ona filifili se lipoti se tasi mai lipoti tutusa - na matou malilie e vaevae ma fesuiai le malamalama na maua i taimi o malologa. Ma e ui lava i lea, e foliga mai e tele naua mea e le o iai. O iinei matou te fia talanoa ai e uiga i mea o loʻo i totonu o nisi o lipoti na matou maua e sili ona manaia
Tuusaunoaga i le C ++ e ala i le prism o faʻatonuga faʻapipiʻi, Roma Rusyaev

Fa'asolo mai
E pei ona taʻu mai e le ulutala, na tilotilo Roma i le galue ma tuusaunoaga e faʻaaoga ai le LLVM e fai ma faʻataʻitaʻiga. I le taimi lava e tasi, mo i latou e le faʻaaogaina Clang ia latou galuega, e mafai lava e le lipoti ona tuʻuina atu se manatu i le auala e mafai ai ona faʻamalosia le code. E mafua lenei mea ona o le au atiaʻe o le tuʻufaʻatasia ma faletusi masani e fesoʻotaʻi ma le tasi ma le isi ma le tele o fofo manuia e mafai ona fetaui.
O lea la, ina ia taulimaina se tuusaunoaga, e tatau ona e faia le tele o mea: valaau le code handling code (pe a iai) poʻo punaoa saoloto i le tulaga o loʻo i ai nei ma vili luga le faaputuga maualuga. O nei mea uma e taʻitaʻia ai le mea moni e faʻaopoopo e le tagata faʻapipiʻi faʻatonuga faʻaopoopo mo valaʻau e ono lafo ai tuusaunoaga. O le mea lea, afai e leʻo faʻatupuina le tuusaunoaga, o le polokalama o le a faia pea ni gaioiga le talafeagai. Ina ia mafai ona faʻaititia i luga ole ulu, LLVM o loʻo i ai le tele o heuristics mo le fuafuaina o tulaga e le manaʻomia ai le faʻaopoopoina o le faʻaogaina o tulafono faʻapitoa pe faʻaititia le numera o "faʻaopoopo" faʻatonuga.
E suʻesuʻe e le failauga le tusa ma le sefulu ma le lua o latou ma faʻaalia tulaga uma e lua e fesoasoani ai i le faʻavaveina o le faʻatinoina o polokalame, ma i latou e le o faʻaogaina nei metotia.
O le mea lea, o Roma Rusyaev e taʻitaʻia tamaiti aʻoga i le faʻaiuga e le mafai ona faʻatinoina i taimi uma le faʻaogaina o tulafono faʻapitoa e aunoa ma le leai, ma tuʻuina atu fautuaga nei:
- pe a atiina ae faletusi, e aoga le lafoaia o tuusaunoaga i mataupu faavae;
- pe afai e manaʻomia pea tuusaunoaga, o soʻo se taimi e mafai ai e aoga le faʻaopoopoina o le noexcept (ma const) modifiers i soʻo se mea ina ia mafai ai e le tagata tuʻufaʻatasia ona faʻaogaina i le tele e mafai ai.
I se tulaga lautele, na faʻamaonia e le failauga le manatu e faʻapea o tuusaunoaga e sili ona faʻaaogaina i se mea maualalo pe lafoai atoa.
O fa'ase'e lipoti o lo'o maua ile so'oga lea:
Generators, coroutines ma isi faiʻai-talatala suamalie, Adi Shavit

Fa'asolo mai
O se tasi o le tele o lipoti i lenei konafesi faʻapitoa i faʻafouga i le C ++ 20 na manatua pea e le gata mo lona faʻaaliga felanulanuaʻi, ae faʻapea foʻi mo lona faʻamaonia manino o faʻafitauli o loʻo i ai nei ma le faʻaogaina o le faʻaogaina o le faʻaogaina (mo le matasele, callbacks).
O loʻo faʻamamafaina e Adi Shavit mea nei: o auala o loʻo avanoa nei e alu i le aofaʻi atoa ma e le maua ai le avanoa i se tulaga vavalalata i totonu (pe latou te faia i le tulaga o le toe foʻi mai, ae faʻatasi ai ma le tele o aʻafiaga le lelei, e pei o Callback Hell) . E foliga mai o loʻo i ai iterators, ae e oʻo lava ia i latou e le o sologa lelei mea uma: e leai ni mea masani e ulufale ai ma ulufafo (amata → faaiʻuga versus rbegin → rend ma isi), e le o manino pe o le a le umi tatou te toe faʻataʻitaʻi ai? Amata ile C++20, ua fo'ia nei fa'afitauli!
Filifiliga muamua: laina. E ala i le afifiina o iterators, matou te maua ai se atinaʻe masani mo le amataga ma le faʻaiʻuga o se suʻesuʻega, ma matou maua foi le tomai e fatu. O nei mea uma e fa'afaigofie ai ona fausia fa'amaumauga uma o fa'amaumauga o paipa. Ae e le o mea uma e matua lamolemole: o se vaega o le faʻatusatusaga faʻatatau o loʻo i totonu o le faʻatinoga o se faʻamatalaga faʻapitoa, lea e mafai ona faʻalavelaveina le code e malamalama ma debug.

Fa'asolo mai
Ia, mo lenei tulaga, C ++ 20 faʻaopoopo coroutines (galuega o latou amio e tutusa ma generators i Python): faʻataunuʻuina e mafai ona tolopoina e ala i le toe faʻafoʻi atu o se tau o loʻo iai nei aʻo faʻasaoina se tulaga vavalalata. O le mea lea, matou te ausia e le gata o le galulue faatasi ma faʻamatalaga e pei ona aliali mai, ae faʻapipiʻi uma ai manatu i totonu o se coroutine patino.
Ae o loʻo i ai se lago i totonu o le suauu: i le taimi nei e naʻo se vaega o loʻo lagolagoina e tagata faʻapipiʻi o loʻo i ai nei, ma e le o faʻatinoina lelei e pei ona tatou manaʻo ai: mo se faʻataʻitaʻiga, e leʻo aoga le faʻaaogaina o faʻamatalaga ma mea le tumau i coroutines. E le gata i lea, o loʻo i ai nisi faʻatapulaʻa i mea e mafai ona avea ma coroutines, ma constexpr functions, constructors/destructors, ma autu e le o aofia ai i lenei lisi.
O le mea lea, e foia ai e coroutines se vaega taua o faʻafitauli i le faigofie o le faʻaogaina o faʻamatalaga, ae o latou faʻatinoga o loʻo iai nei e manaʻomia ai le faʻaleleia.
Meafaitino:
- Fa'asolo mai C++ Rusia -
C++ togafiti mai Yandex.Taxi, Anton Polukhin
I aʻu galuega faʻapolofesa, o nisi taimi e tatau ona ou faʻatinoina mea faʻapitoa fesoasoani: o se afifi i le va o le atinaʻe i totonu ma le API o nisi faletusi, logging poʻo le faʻasalalau. I lenei tulaga, e masani lava e leai se manaʻoga mo soʻo se faʻaopoopoga faʻaopoopo. Ae faʻafefea pe a faʻaogaina nei vaega i nisi o auaunaga sili ona lauiloa ile RuNet? I se tulaga faapena, e tatau ona e faʻagasolo terabytes i le itula o ogalaau naʻo oe! Ona taulia ai lea o millisecond uma ma o lea e tatau ai ona e faia togafiti eseese - na talanoa Anton Polukhin e uiga ia i latou.
Masalo o le faʻataʻitaʻiga sili ona manaia o le faʻatinoina o le faʻataʻitaʻiga-i-faʻatinoina (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_;
};I lenei faʻataʻitaʻiga, muamua ou te manaʻo e faʻaumatia faila faila o faletusi i fafo - o le a faʻapipiʻi vave, ma e mafai ona e puipuia oe lava mai feeseeseaiga igoa ma isi mea sese faapena.
Lelei, na matou siitia atu #include i le faila .cpp: matou te manaʻomia se taʻutinoga i luma o le API afifi, faʻapea foʻi ma std::unique_ptr. O lea ua i ai a matou faʻasoa faʻamalosi ma isi mea le fiafia e pei o faʻamaumauga faʻasalalau i luga o le tele o faʻamaumauga ma faʻaitiitia faʻamaoniga. std::aligned_storage e mafai ona fesoasoani i nei mea uma.
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_;
};Pau lava le faʻafitauli: e manaʻomia ona e faʻamaonia le tele ma le faʻaogaina mo afifi taʻitasi - seʻi fai la matou pimpl template ma faʻamau , faʻaaoga nisi o mea taua ma faʻaopopo se siaki i le faʻaleagaina na matou maua mea uma saʻo:
~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"
);
}Talu ai o le T ua uma ona faʻamalamalamaina pe a faʻaogaina le faʻaleagaina, o lenei code o le a faʻasaʻo saʻo ma i le tuʻufaʻatasiga o le a faʻaalia ai le tele manaʻomia ma le faʻaogaina o tau e manaʻomia ona tuʻuina o ni mea sese. O le mea lea, i le tau o le tasi faʻaopoopo faʻapipiʻi faʻasolosolo, matou te faʻaumatia le vaevaega malosi o vasega afifi, natia le API i se faila .cpp faʻatasi ai ma le faʻatinoga, ma maua foi se mamanu e sili atu ona talafeagai mo le faʻaogaina e le processor.
O le faʻapipiʻiina ma le faʻavasegaina na foliga mai e le fiafia ma o le a le taʻua i lenei iloiloga.
O fa'ase'e lipoti o lo'o maua ile so'oga lea:
O auala fa'aonaponei mo le tausia o lau code DRY, Björn Fahller
I lenei lauga, o Björn Fahller o loʻo faʻaalia ai le tele o auala eseese e faʻafefe ai le faʻaletonu o le faʻasologa o siaki tulaga:
assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);Fa'alogo masani? E ala i le fa'aogaina o le tele o auala mamana C++ na fa'alauiloa mai i tulaga fa'ata'ita'i, e mafai ona e fa'atinoina ma le mata'utia le fa'atinoga tutusa e aunoa ma se fa'asalaga fa'atino. Fa'atusatusa:
assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));Ina ia taulimaina se numera le tumau o siaki, e manaʻomia vave ona e faʻaogaina faʻataʻitaʻiga variadic ma faʻaaliga gaugau. Seʻi tatou manatu tatou te manaʻo e siaki le tutusa o le tele o fesuiaiga i le enum's state_type element. O le mea muamua e sau i lou mafaufau o le tusi lea o se galuega fesoasoani 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) || ...);
}
O lenei i'uga vavalo e fa'anoanoa. E oʻo mai i le taimi nei e leʻo sili atu ona mafai ona faitau le code:
assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED)); Ole fa'ata'ita'iga fa'ata'ita'iga e le o tu'aiga ole a fesoasoani e fa'aleleia teisi le tulaga. Faatasi ai ma la latou fesoasoani, o le a matou faʻafeiloaʻi elemene numera o le enum i le lisi o faʻataʻitaʻiga:
template <state_type ... states>
bool is_any_of(state_type t) {
return ((t == states) | ...);
}
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state)); I le faʻaaogaina o le taʻavale i se faʻataʻitaʻiga faʻataʻitaʻiga e le o se ituaiga (C ++ 17), o le auala e faʻapipiʻi lautele i faʻatusatusaga e le gata i elemene state_type, ae faʻapea foʻi ma ituaiga muamua e mafai ona faʻaaogaina e fai ma faʻataʻitaʻiga faʻataʻitaʻiga e le o ituaiga:
template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
return ((t == alternatives) | ...);
}E ala i nei fa'aleleia fa'asolosolo, e maua ai le syntax lelei e mana'omia mo siaki:
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);
I lenei faʻataʻitaʻiga, o le toesega taʻiala e tuʻuina atu le faʻataʻitaʻiga faʻataʻitaʻiga o loʻo manaʻomia i le tagata faʻapipiʻi, lea e iloa ituaiga o finauga faufale.
E le gata i lea - sili atu ona manaia. Ua aʻoaʻo e Bjorn pe faʻafefea ona faʻasalalau le faʻasologa o tulafono mo tagata faʻatusatusa i tua atu o ==, ona sosoo ai lea ma gaioiga faʻapitoa. I luga o le ala, o foliga e pei o le no_unique_address attribute (C++20) ma faʻataʻitaʻiga faʻataʻitaʻiga i galuega lambda (C++ 20) o loʻo faʻamatalaina e faʻaaoga ai faʻataʻitaʻiga o le faʻaoga. (Ioe, o le taimi nei o le lambda syntax e sili atu ona faigofie ona manatua - o taiga sosoo e fa o puipui o ituaiga uma.) O le fofo mulimuli e faʻaaoga ai galuega e pei o faʻamatalaga faufale e faʻamafanafanaina ai loʻu agaga, ae le o le taʻua o le faʻaaliga tuple i tu ma aga sili a lambda. fa'atatauga.
I le faaiuga, aua nei galo e faʻapupulaina:
- Manatua o lambdas e constexpr e leai se totogi;
- Se'i o tatou fa'aopoopo i luma lelei ma va'ai i lana fa'asologa mataga e fa'atatau i le fa'amaufa'ailoga i le lambda tapuni;
- Se'i o tatou tu'uina atu i le tu'ufa'atasia le tele o avanoa mo fa'ata'ita'iga fa'atasi ai ma tulaga fa'apea;
- Sei o tatou vaʻaia le faʻaogaina o mea sese e sili atu ona malamalama i faʻataʻitaʻiga faʻafetai i faʻamatalaga faʻafoʻi faʻatatau o lambdas. Ole mea lea ole a fa'amalosia ai le tagata tu'ufa'atasi e fai nisi siaki a'o le'i ta'ua moni le galuega fa'ata'ita'i - ile la'asaga ole siaki ituaiga.
Mo fa'amatalaga, fa'amolemole va'ai i meafai a'oa'oga:
- Lipoti fa'ase'e:
O tatou lagona
O la matou uluai auai i le C++ Rusia sa manatua pea mo lona malosi. Na ou maua le lagona o le C ++ Rusia o se mea faamaoni, lea o le laina i le va o aʻoaʻoga ma fesoʻotaʻiga ola e toetoe lava a le iloa. O mea uma lava, mai le lagona o failauga e o'o i tauvaga mai pa'aga o le fa'afiafiaga, e fa'aosofia ai talanoaga vevela. O mea o loʻo i totonu o le fonotaga, e aofia ai lipoti, e aofia ai le lautele lautele o mataupu e aofia ai C ++ faʻafouga, suʻesuʻega faʻataʻitaʻiga o galuega tetele ma mafaufauga faʻavae fausaga. Ae o le a le fetaui le le amanaiaina o le vaega lautele o le mea na tupu, lea e fesoasoani e foia pa puipui gagana e le gata i le C++.
Matou te faʻafetai i le faʻatulagaina o konafesi mo le avanoa e auai ai i se faʻalavelave faʻapea!
Atonu na e vaʻai i le faʻasalalauga 'post e uiga i le taimi ua tuanaʻi, taimi nei ma le lumanaʻi o C++ Rusia .
Faafetai mo le faitau, ma matou te faamoemoe o le matou toe faamatalaina o mea na tutupu na aoga!
puna: www.habr.com
