Sihumushe kanjani imigqa eyizigidi eziyi-10 yekhodi ye-C++ ezingeni le-C++14 (bese kuba ku-C++17)

Esikhathini esithile esidlule (ekwindla ka-2016), ngesikhathi sokuthuthukiswa kwenguqulo elandelayo ye-1C:Inkundla yobuchwepheshe bebhizinisi, kwaphakama umbuzo phakathi kwethimba lokuthuthukisa mayelana nokusekela izinga elisha. I-C ++ 14 kukhodi yethu. Ukushintshela ezingeni elisha, njengoba besicabanga, kuzosivumela ukuthi sibhale izinto eziningi ngobunono, kalula nangokwethembeka, futhi kuzokwenza kube lula ukusekelwa nokugcinwa kwekhodi. Futhi kubonakala sengathi akukho okungavamile ekuhumusheni, uma kungenjalo ngesilinganiso sesisekelo sekhodi kanye nezici ezithile zekhodi yethu.

Kulabo abangazi, i-1C:Enterprise iyindawo yokuthuthukiswa okusheshayo kwezinhlelo zokusebenza zebhizinisi ze-cross-platform kanye nesikhathi sokusebenza sokwenza kwazo kuma-OS nama-DBMS ahlukene. Ngokuvamile, umkhiqizo uqukethe:

Sizama ukubhala ikhodi efanayo yezinhlelo zokusebenza ezihlukene ngangokunokwenzeka - isisekelo sekhodi yeseva sivamile ngo-99%, isisekelo sekhodi yeklayenti simayelana nama-95%. I-1C:Inkundla yobuchwepheshe bebhizinisi ibhalwe ngokuyinhloko ngo-C++ futhi izici zekhodi ezilinganiselwe zinikezwe ngezansi:

  • Imigqa eyizigidi eziyi-10 yekhodi ye-C++,
  • Amafayela ayizinkulungwane eziyi-14,
  • amakilasi ayizinkulungwane ezingama-60,
  • izindlela eziyingxenye yesigidi.

Futhi zonke lezi zinto bekufanele zihunyushelwe ku-C++14. Namuhla sizokutshela ukuthi sikwenze kanjani lokhu nokuthi yini esihlangabezane nayo kulolu hlelo.

Sihumushe kanjani imigqa eyizigidi eziyi-10 yekhodi ye-C++ ezingeni le-C++14 (bese kuba ku-C++17)

Umusho wokuzihlangula

Yonke into ebhalwe ngezansi mayelana nomsebenzi ongasheshi/osheshayo, (hhayi) ukusetshenziswa kwenkumbulo okukhulu ngokusetshenziswa kwamakilasi ajwayelekile kumalabhulali ahlukahlukene kusho into eyodwa: lokhu kuyiqiniso KITHI. Kungenzeka ukuthi ukuqaliswa okujwayelekile kuzofanelana kangcono nemisebenzi yakho. Siqale kweyethu imisebenzi: sithathe idatha eyayijwayelekile kumakhasimende ethu, sasebenzisa izimo ezijwayelekile kuwo, sabheka ukusebenza, inani lememori esetshenzisiwe, njll., futhi sahlaziya ukuthi thina namakhasimende ethu sanelisekile ngemiphumela enjalo noma cha. . Futhi benza kuye ngokuthi.

Esinakho

Ekuqaleni, sabhala ikhodi yesikhulumi se-1C:Enterprise 8 sisebenzisa i-Microsoft Visual Studio. Iphrojekthi yaqala ekuqaleni kwawo-2000 futhi sasinenguqulo ye-Windows kuphela. Ngokwemvelo, kusukela ngaleso sikhathi ikhodi ithuthukiswe ngenkuthalo, izindlela eziningi zibhalwe kabusha ngokuphelele. Kodwa ikhodi yabhalwa ngokwezinga lika-1998, futhi, isibonelo, abakaki bethu be-engeli yesokudla bahlukaniswa yizikhala ukuze ukuhlanganiswa kuphumelele, kanje:

vector<vector<int> > IntV;

Ngo-2006, ngokukhishwa kwenguqulo yesikhulumi 8.1, saqala ukusekela i-Linux futhi sashintshela kumtapo wolwazi ojwayelekile wenkampani yangaphandle. I-STLPort. Esinye sezizathu zoshintsho kwakuwukusebenza ngemigqa ebanzi. Kukhodi yethu, sisebenzisa i-std::wstring, esekelwe ohlotsheni lwe-wchar_t, kulo lonke. Usayizi wayo ku-Windows ungamabhayithi angu-2, futhi ku-Linux okuzenzakalelayo ngamabhayithi angu-4. Lokhu kuholele ekungasebenzini kwezivumelwano zethu kanambambili phakathi kweklayenti neseva, kanye nedatha ehlukahlukene eqhubekayo. Usebenzisa izinketho ze-gcc, ungacacisa ukuthi usayizi we-wchar_t ngesikhathi sokuhlanganiswa nawo ungamabhayithi angu-2, kodwa ungakhohlwa ngokusebenzisa umtapo wezincwadi ojwayelekile ovela kumdidiyeli, ngoba isebenzisa i-glibc, yona ehlanganiselwa i-4-byte wchar_t. Ezinye izizathu kwakuwukusetshenziswa okungcono kwamakilasi ajwayelekile, ukusekelwa kwamathebula e-hashi, ngisho nokulingisa i-semantics yokuhamba ngaphakathi kweziqukathi, esazisebenzisa ngokuzimisela. Futhi esinye isizathu, njengoba besho ekugcineni kodwa okungenani, kwakuwukusebenza kwentambo. Sasinekilasi lethu lezintambo, ngoba... Ngenxa yokucaciswa kwesoftware yethu, ukusebenza kwentambo kusetshenziswa kabanzi futhi kithina lokhu kubalulekile.

Iyunithi yezinhlamvu yethu isuselwe emibonweni yokuthuthukisa iyunithi yezinhlamvu evezwe emuva ekuqaleni kwawo-2000 U-Andrei Alexandrescu. Kamuva, lapho u-Alexandrescu esebenza ku-Facebook, ngokusikisela kwakhe, kwasetshenziswa ulayini enjini ye-Facebook esebenza ngezimiso ezifanayo (bheka umtapo wolwazi. ubuwula).

Ulayini wethu usebenzise ubuchwepheshe obubili obuyinhloko:

  1. Ngamanani amafushane, i-buffer yangaphakathi entweni yeyunithi yezinhlamvu ngokwayo iyasetshenziswa (engadingi ukwabiwa kwememori eyengeziwe).
  2. Kubo bonke abanye, kusetshenziswa imishini Kopisha Ekubhaleni. Inani leyunithi yezinhlamvu ligcinwa endaweni eyodwa, futhi isibali sereferensi sisetshenziswa phakathi nomsebenzi/ukulungiswa.

Ukuze kusheshiswe ukuhlanganiswa kweplathifomu, asibandakanyi ukusetshenziswa kokusakaza kokuhlukile kwethu kwe-STLPort (esingazange sikusebenzise), lokhu kusinike ukuhlanganiswa okusheshayo okungaba ngu-20%. Kamuva kwadingeka sisebenzise okulinganiselwe Boost. I-Boost isebenzisa kakhulu ukusakaza, ikakhulukazi kuma-API ayo wesevisi (isibonelo, ukugawulwa kwemithi), ngakho kudingeke ukuthi siyilungise ukuze sisuse ukusetshenziswa kokusakaza. Lokhu, nakho, kwenze kwaba nzima ngathi ukuthuthela ezinguqulweni ezintsha ze-Boost.

Indlela yesithathu

Lapho sithuthela ezingeni le-C++14, sicabangele lezi zinketho ezilandelayo:

  1. Thuthukisa i-STLPort esiyishintshe ibe sezingeni le-C++14. Inketho inzima kakhulu, ngoba ... ukusekelwa kwe-STLPort kwanqanyulwa ngo-2010, futhi kuzodingeka sizakhele yonke ikhodi yayo ngokwethu.
  2. Ukushintshela kokunye ukusetshenziswa kwe-STL okuhambisana ne-C++14. Kufiseleka kakhulu ukuthi lokhu kuqaliswa kube okweWindows neLinux.
  3. Lapho uhlanganisela i-OS ngayinye, sebenzisa umtapo wolwazi owakhelwe kumhlanganisi ohambisanayo.

Inketho yokuqala yenqatshwe ngokuphelele ngenxa yomsebenzi omningi.

Sacabanga ngenketho yesibili isikhathi esithile; kuthathwa njengekhandidethi libc++, kodwa ngaleso sikhathi yayingasebenzi ngaphansi kweWindows. Ukufaka i-libc++ ku-Windows, kuzodingeka wenze umsebenzi omningi - isibonelo, bhala yonke into ngokwakho ehlobene nemicu, ukuvumelanisa kwentambo kanye ne-atomicity, njengoba i-libc++ isetshenziswa kulezi zindawo. I-POSIX API.

Futhi sikhethe indlela yesithathu.

Uguquko

Ngakho-ke, kudingeke ukuthi esikhundleni sokusetshenziswa kwe-STLPort sifake imitapo yolwazi yabahlanganisi abahambisanayo (i-Visual Studio 2015 ye-Windows, i-gcc 7 ye-Linux, i-clang 8 ye-macOS).

Ngenhlanhla, ikhodi yethu yabhalwa ikakhulukazi ngokweziqondiso futhi ayizange isebenzise zonke izinhlobo zamaqhinga ahlakaniphile, ngakho ukuthuthela emitapo yolwazi emisha kwaqhubeka ngokushelela, ngosizo lwemibhalo ethathela indawo amagama ezinhlobo, amakilasi, izindawo zamagama kanye nokuhlanganisa emthonjeni. amafayela. Ukuthutha kuthinte amafayela omthombo angu-10 (kwangu-000). i-wchar_t ithathelwe indawo ngu-char14_t; sinqume ukuyeka ukusetshenziswa kwe-wchar_t, ngoba I-char000_t ithatha amabhayithi angu-16 kuwo wonke ama-OS futhi ayonakalisi ukusebenzisana kwekhodi phakathi kweWindows ne-Linux.

Kwakukhona izigigaba ezincane. Isibonelo, ku-STLPort i-iterator ingase iphonswe ngokungagunci esikhombi sento ethile, futhi kwezinye izindawo kukhodi yethu kwasetshenziswa lokhu. Emitapo yolwazi emisha kwakungasenakwenzeka ukwenza lokhu, futhi lezi zingxenye kwadingeka zihlaziywe futhi zibhalwe kabusha ngesandla.

Ngakho-ke, ukufuduka kwekhodi kuqedile, ikhodi ihlanganiswe kuwo wonke amasistimu wokusebenza. Isikhathi sokuhlolwa.

Ukuhlolwa ngemva koshintsho kubonise ukwehla kokusebenza (kwezinye izindawo kufika ku-20-30%) kanye nokwanda kokusetshenziswa kwememori (kufika ku-10-15%) uma kuqhathaniswa nenguqulo endala yekhodi. Lokhu, ikakhulukazi, bekungenxa yokusebenza kahle kwamayunithi ezinhlamvu ajwayelekile. Ngakho-ke, kwadingeka siphinde sisebenzise ulayini wethu, oshintshwe kancane.

Isici esithakazelisayo sokuqaliswa kweziqukathi emitapo yolwazi eshumekiwe siphinde savezwa: okungenalutho (ngaphandle kwezinto) std::map kanye ne-std::setha kusukela emitatsheni yolwazi eyakhelwe ngaphakathi yabela inkumbulo. Futhi ngenxa yezici zokuqalisa, kwezinye izindawo kukhodi iziqukathi eziningi ezingenalutho zalolu hlobo ziyadalwa. Iziqukathi ezijwayelekile zenkumbulo zabelwa kancane, engxenyeni eyodwa yempande, kodwa kithina lokhu kwaba bucayi - ezimweni eziningi, ukusebenza kwethu kwehle kakhulu futhi ukusetshenziswa kwememori kwanda (uma kuqhathaniswa ne-STLPort). Ngakho-ke, kukhodi yethu sithathe indawo yalezi zinhlobo ezimbili zeziqukathi ezivela emitapweni yolwazi eyakhelwe ngaphakathi ngokusetshenziswa kwazo kusuka ku-Boost, lapho lezi ziqukathi zingenaso lesi sici, futhi lokhu kuxazulule inkinga ngokunciphisa nokwandisa ukusetshenziswa kwememori.

Njengoba kuvame ukwenzeka ngemuva kwezinguquko ezinkulu kumaphrojekthi amakhulu, ukuphindaphinda kokuqala kwekhodi yomthombo akuzange kusebenze ngaphandle kwezinkinga, futhi lapha, ikakhulukazi, ukusekelwa kokulungisa amaphutha ekusetshenzisweni kweWindows kwafika kahle. Isinyathelo ngesinyathelo saqhubekela phambili, futhi ngentwasahlobo ka-2017 (inguqulo 8.3.11 1C:Enterprise) ukufuduka kwase kuqediwe.

Imiphumela

Ukushintshela ezingeni le-C++14 kusithathe cishe izinyanga eziyisi-6. Ezikhathini eziningi, umthuthukisi oyedwa (kodwa oqeqeshwe kakhulu) ubesebenza kuphrojekthi, futhi esigabeni sokugcina abameleli bamaqembu anomthwalo wemfanelo wezindawo ezithile bajoyina - i-UI, iqoqo leseva, amathuluzi okuthuthukisa nawokuphatha, njll.

Ushintsho lwenze waba lula kakhulu umsebenzi wethu wokuthuthela ezinguqulweni zakamuva zezinga. Ngakho, inguqulo 1C:Enterprise 8.3.14 (eyathuthukiswayo, ukukhishwa okuhlelelwe ekuqaleni konyaka ozayo) isivele idluliselwe ezingeni. C++17.

Ngemuva kokuthutha, onjiniyela banezinketho eziningi. Uma phambilini besinenguqulo yethu eguquliwe ye-STL kanye ne-std namespace eyodwa, manje sinezigaba ezijwayelekile ezivela emitapweni yolwazi yeqoqo eyakhelwe ngaphakathi endaweni yamagama ye-std, endaweni yegama ye-stdx - imigqa yethu neziqukathi ezilungiselelwe imisebenzi yethu, ngokuthuthukisa - the inguqulo yakamuva ye-boost. Futhi umthuthukisi usebenzisa lawo makilasi afaneleka kahle ukuxazulula izinkinga zakhe.

Ukuqaliswa "komdabu" kwabakhi abahambayo nakho kuyasiza ekuthuthukisweni (hambisa abakhi) ngenani lamakilasi. Uma ikilasi linomakhi onyakazayo futhi leli klasi libekwe esitsheni, i-STL bese ithuthukisa ukukopishwa kwezakhi ngaphakathi kwesiqukathi (isibonelo, lapho isiqukathi sinwetshwa futhi kudingekile ukushintsha umthamo nokwaba kabusha inkumbulo).

Isipuni setiyela

Mhlawumbe umphumela ongajabulisi (kodwa hhayi obucayi) wokufuduka ukuthi sibhekene nokwenyuka kwevolumu. obj amafayela, futhi umphumela ogcwele wokwakha nawo wonke amafayela aphakathi nendawo waqala ukuthatha u-60-70 GB. Lokhu kuziphatha kungenxa yezici zemitapo yolwazi ejwayelekile yesimanje, engasagxekwa kangako ngosayizi wamafayela esevisi akhiqiziwe. Lokhu akuthinti ukusebenza kwesicelo esihlanganisiwe, kodwa kubangela inani lokuphazamiseka ekuthuthukisweni, ikakhulukazi, kwandisa isikhathi sokuhlanganiswa. Izidingo zesikhala samahhala sediski kumaseva wokwakha kanye nasemishinini yonjiniyela ziyakhula. Onjiniyela bethu basebenza ezinguqulweni ezimbalwa zeplathifomu ngokuhambisana, futhi amakhulu amagigabhayithi wamafayela aphakathi kwesinye isikhathi adala ubunzima emsebenzini wawo. Inkinga ayijabulisi, kodwa ayibucayi; sihlehlise isisombululo sayo okwamanje. Sibheka ubuchwepheshe njengenye yezinketho zokuyixazulula ukwakha ubunye (ikakhulukazi, i-Google iyayisebenzisa lapho ithuthukisa isiphequluli se-Chrome).

Source: www.habr.com

Engeza amazwana