{"id":32466,"date":"2019-10-31T21:47:13","date_gmt":"2019-10-31T18:47:13","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17\/"},"modified":"2019-10-31T21:47:13","modified_gmt":"2019-10-31T18:47:13","slug":"kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17","title":{"rendered":"Kuidas me t\u00f5lkisime 10 miljonit C++ koodirida C++14 standardiks (ja seej\u00e4rel C++17 standardiks)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u00f5ni aeg tagasi (2016. aasta s\u00fcgisel), kui arendati tehnoloogilise platvormi 1C: Ettev\u00f5te uut versiooni, kerkis arendusmeeskonnas k\u00fcsimus uue standardi toetamise kohta <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B14\">C++14<\/a><\/noindex> meie koodis. \u00dcleminek uuele standardile, nagu me oletame, v\u00f5imaldaks meil kirjutada paljusid asju elegantsemalt, lihtsamalt ja usaldusv\u00e4\u00e4rsemalt, lihtsustades koodi toetust ja hooldust. Ja t\u00f5lkes ei tundu olevat midagi erakordset, kui mitte arvestada koodibaasi ulatust ja meie koodi spetsiifilisi omadusi.<\/p>\n<p>Neile, kes ei tea, 1C: Ettev\u00f5te on keskkond kiireks mitmeplatvormiliste \u00e4rianal\u00fc\u00fcside arendamiseks ja nende k\u00e4itamiseks erinevates ops\u00fcsteemides ja andmebaasides. \u00dcldiselt kuuluvad toote koosseisu:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000885.htm\">Rakenduste serverite klaster<\/a><\/noindex>, t\u00f6\u00f6tab Windowsil ja Linuxil<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000124.htm\">Klient<\/a><\/noindex>, mis suhtleb serveriga http(s) kaudu v\u00f5i oma binaarprotokolli kaudu, t\u00f6\u00f6tab Windowsil, Linuxil, macOS-il<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/315414\/\">Veebiklient<\/a><\/noindex>, t\u00f6\u00f6tab brauserites Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari (kirjutatud JavaScriptis)<\/li>\n<li>Arenduskeskkond (<noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000008.htm\">Konfiguratsiooni t\u00f6\u00f6riist<\/a><\/noindex>), t\u00f6\u00f6tab Windowsil, Linuxil, macOS-il<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000813.htm\">Rakenduste serverite haldusvahendid, t\u00f6\u00f6tavad Windowsil, Linuxil, macOS-il<\/a><\/noindex> Mobiiliklient<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/mobilnyy-klient\/\">Mobiilne klient<\/a><\/noindex>, serveriga http(s) kaudu \u00fchendatav, t\u00f6\u00f6tab Androidi, iOSi ja Windowsi t\u00f6\u00f6tavatel mobiilseadmetel<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/283198\/\">Mobiiliplatvorm<\/a><\/noindex> \u2014 raamistiku mobiilirakenduste loomiseks, mis t\u00f6\u00f6tavad Androidi, iOSi ja Windowsi seadmetes ning pakuvad s\u00fcnkroonimise v\u00f5imalust<\/li>\n<li>Arenduskeskkond <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/IDE\/\">1C:Enterprise Development Tools<\/a><\/noindex>, kirjutatud Java keeles<\/li>\n<li>Server <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/422903\/\">Koost\u00f6\u00f6 s\u00fcsteemid<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nP\u00fc\u00fcame maksimaalselt kirjutada \u00fchte koodi erinevatele operatsioonis\u00fcsteemidele \u2013 serveri koodibaas on 99% \u00fchine, kliendi oma umbes 95%. Tehnoloogiline platvorm 1C: Ettev\u00f5te on enamasti kirjutatud C++ keeles ja allpool on ligikaudsed koodi omadused:<\/p>\n<ul>\n<li>10 miljonit C++ koodi rida,<\/li>\n<li>14 tuhat faili,<\/li>\n<li>60 tuhat klassi,<\/li>\n<li>poole miljoni meetodit.<\/li>\n<\/ul>\n<p>\nJa kogu see s\u00fcsteem tuli C++14 peale \u00fcle viia. Kuidas me seda tegime ja millega me protsessi k\u00e4igus silmitsi seisime, r\u00e4\u00e4gime t\u00e4na.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas me t\u00f5lkisime 10 miljonit C++ koodirida C++14 standardiks (ja seej\u00e4rel C++17 standardiks)\" src=\"\/wp-content\/uploads\/2019\/04\/7f9270bc37fa9fd462ac9efbb12f0764.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Vastutusest loobumine<\/h3>\n<p>\nAll the text below about slow\/fast performance and (non)trivial memory consumption of standard class implementations in various libraries means one thing: this is true FOR US. It is quite possible that the standard implementations suit your tasks best. We based our work on our needs: we took typical data from our clients, ran typical scenarios on them, observed performance, memory consumption, and so forth, and analyzed whether such results satisfied us and our clients or not. We then acted accordingly.<\/p>\n<h3>What we had<\/h3>\n<p>\nInitially, we wrote the code for the 1C:Enterprise 8 platform using Microsoft Visual Studio. The project started in the early 2000s, and we only had a version for Windows. Naturally, since then the code has evolved significantly, and many mechanisms have been completely rewritten. However, the code was written according to the 1998 standard, and, for example, the right angle brackets were spaced to allow for successful compilation, like this:<\/p>\n<pre><code class=\"cpp\">vector&lt;vector &gt; IntV;<\/code><\/pre>\n<p>\nIn 2006, with the release of version 8.1 of the platform, we began supporting Linux and switched to a third-party standard library. <noindex><a rel=\"nofollow\" href=\"http:\/\/www.stlport.org\/\">STLPort<\/a><\/noindex>. \u00dcks p\u00f5hjuseid \u00fcleminekuks oli t\u00f6\u00f6tamine laiade laudadega. Meie koodis kasutame laialdaselt std::wstring, mis p\u00f5hineb t\u00fc\u00fcbile wchar_t. Selle suurus Windowsis on 2 bitti, Linuxis aga vaikimisi 4 bitti. See p\u00f5hjustas meie binaarsete protokollide \u00fchilduvuse probleemid kliendi ja serveri vahel, samuti erinevate p\u00fcsivate andmete osas. Gcc valikute abil saab m\u00e4\u00e4rata, et wchar_t suurus kompileerimisel oleks samuti 2 bitti, kuid siis v\u00f5ib standardse raamatukogu kasutamisest unustada, kuna see kasutab glibc't, mis on omakorda kompileeritud 4-bitiseks wchar_t-ks. Muudeks p\u00f5hjusteks olid paremad standardklasside rakendused, h\u00e4shtabelite tugi ja isegi konteinerite sees liikumise semantika emuleerimine, mida me aktiivselt kasutasime. Ja veel \u00fcks p\u00f5hjus, nagu \u00f6eldakse, last but not least, oli stringide j\u00f5udlus. Meil oli oma klass stringide jaoks, kuna meie tarkvara erip\u00e4ra t\u00f5ttu kasutame stringi operatsioone v\u00e4ga laialdaselt ja see on meie jaoks kriitiline. <\/p>\n<p>Meie string p\u00f5hineb stringide optimeerimise ideedel, mis v\u00e4ljendati juba 2000. aastate alguses <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B5%D1%81%D0%BA%D1%83,_%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B9\">Andrei Alexandrescu<\/a><\/noindex>. Hiljem, kui Alexandrescu t\u00f6\u00f6tas Facebookis, kasutati tema ettepanekul Facebooki mootoris sarnase p\u00f5him\u00f5ttega rida (vt raamatukogu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/folly\">folly<\/a><\/noindex>).<\/p>\n<p>Meie real kasutati kahte peamist optimeerimistehnoloogiat:<\/p>\n<ol>\n<li>L\u00fchikeste v\u00e4\u00e4rtuste jaoks kasutatakse sisemist puhvers\u00e4ilitust, mis asub stringi objekti enda sees (mis ei n\u00f5ua t\u00e4iendavat m\u00e4lu eraldamist).<\/li>\n<li>K\u00f5ikide teiste jaoks kasutatakse mehaanikat <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8\">Copy On Write<\/a><\/noindex>. Stringi v\u00e4\u00e4rtus salvestatakse \u00fchte kohta, selle m\u00e4\u00e4ramisel\/modifitseerimisel kasutatakse viidatud loendurit.<\/li>\n<\/ol>\n<p>\nKuna meie platformi kompileerimist kiirusme t\u00f5hustamiseks v\u00e4ljastasime STLPorti variandi voogude teostuse (mida me ei kasutanud), andis see meile ligikaudu 20% kiirusme t\u00f5hususe. Hiljem pidime kergelt kasutama <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Boost\">Boost<\/a><\/noindex>. Boost kasutab aktiivselt vooge, kaasa arvatud oma teeninduse API-des (n\u00e4iteks logimise jaoks), seet\u00f5ttu pidime seda modifitseerima, et v\u00e4listada voogude kasutamine. See omakorda raskendas meil uutele Boosti versioonidele \u00fcleminekut. <\/p>\n<h3>Kolmas tee<\/h3>\n<p>\nC++14 standardile \u00fclemisel arutasime selliseid variante:<\/p>\n<ol>\n<li>Kohandame meie modifitseeritud STLPorti standardile C++14. See valik on \u00e4\u00e4rmiselt keeruline, kuna STLPorti tugi l\u00f5petati 2010. aastal ja selle kogu koodi taastamine oleks pidanud meie poolt toimuma.<\/li>\n<li>\u00dcleminekisele teisele STL-implementatsioonile, mis on \u00fchilduv C++14-ga. Eelistatavalt peaks see implementatsioon olema Windowsi ja Linuxi jaoks.<\/li>\n<li>Kasutame iga operatsioonis\u00fcsteemi kompileerimisel vastava kompilaatori sisseehitatud teeki.<\/li>\n<\/ol>\n<p>\nEsimene variant l\u00fckati kohe tagasi liiga suure t\u00f6\u00f6mahu t\u00f5ttu.<\/p>\n<p>M\u00f5tlesime m\u00f5nda aega teisele v\u00f5imalusele; kandidaadina vaatasime <noindex><a rel=\"nofollow\" href=\"https:\/\/libcxx.llvm.org\/\">libc++<\/a><\/noindex>, kuid sel ajal ei t\u00f6\u00f6tanud see Windowsi all. Libc++ portimiseks Windowsi, oleks pidanud palju t\u00f6\u00f6d tegema \u2014 n\u00e4iteks kirjutama ise k\u00f5ik, mis puudutab l\u00f5ime, l\u00f5imede s\u00fcnkroniseerimist ja atomaarset k\u00e4itumist, kuna libc++-is kasutati nendes valdkondades <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/POSIX\">POSIX API<\/a><\/noindex>.<\/p>\n<p>Ja me valisime kolmanda variandi.<\/p>\n<h3>\u00dcleminek<\/h3>\n<p>\nSeega pidime asendama STLPorti kasutamise vastavate kompilaatorite teekidega (Visual Studio 2015 Windowsi jaoks, gcc 7 Linuxi jaoks, clang 8 macOS-i jaoks). <\/p>\n<p>\u00d5nneks oli meie kood peamiselt kirjutatud juhiste j\u00e4rgi ega kasutanud igasuguseid kavalusi, nii et migratsioon uutele raamatukogudele kulges suhteliselt sujuvalt, kasutades skripte, mis asendasid l\u00e4htefailides t\u00fc\u00fcpide, klasside, nimede ja lisade nimed. Migratsioon h\u00f5lmas 10 000 l\u00e4htefaili (kokku 14 000). wchar_t asendati char16_t-ga; otsustasime loobuda wchar_t kasutamisest, kuna char16_t v\u00f5tab k\u00f5ikides ops\u00fcsteemides 2 baiti ja ei rikku koodi \u00fchilduvust Windowsi ja Linuxi vahel.<\/p>\n<p>Ilma v\u00e4ikeste seiklusteta ei saanud hakkama. N\u00e4iteks STLPort'is v\u00f5isit iteraatori implitsiitselt elemendi pointeriks castida, ja m\u00f5nes meie koodi osas see toimis. Uutes raamatukogudes see enam ei toiminud, seega tuli neid kohti anal\u00fc\u00fcsida ja k\u00e4sitsi \u00fcmber kirjutada. <\/p>\n<p>Nii et koodi migratsioon on l\u00f5pule viidud, kood kompileerub k\u00f5igis ops\u00fcsteemides. On saanud aeg testimiseks. <\/p>\n<p>\u00dcleminekust tehtud testid n\u00e4itasid, et j\u00f5udlus langes (kohati 20-30%) ja m\u00e4lu tarbimine suurenes (10-15%) v\u00f5rreldes vana koodiversiooniga. See oli peamiselt tingitud standardsete konteinerite ebapiisavast toimimisest. Seet\u00f5ttu pidime taas oma, veidi t\u00e4iustatud versiooni kasutama. <\/p>\n<p>Samuti ilmus v\u00e4lja huvitav omadus konteinerite rakendamisel sisseehitatud raamatukogudes: t\u00fchjad (ilma elementideta) std::map ja std::set sisseehitatud raamatukogudes eraldavad m\u00e4lu. Meie koodi erip\u00e4ra t\u00f5ttu luuakse m\u00f5nes kohas \u00fcsna palju selliseid t\u00fchje konteinerite. Standardsete konteinerite m\u00e4lutarve on v\u00e4ike, \u00fche juureelemendi jaoks, kuid meie jaoks osutus see kriitiliseks \u2013 mitmes stsenaariumis langes meie j\u00f5udlus oluliselt ja m\u00e4lu tarbimine suurenes (v\u00f5rreldes STLPortiga). Seet\u00f5ttu asendasime meie koodis need kaks t\u00fc\u00fcpi konteinerit sisseehitatud raamatukogudest Boosti rakendustena, kus sellist omadust ei olnud, ja see lahendas probleemi aeglustumise ja suurenenud m\u00e4lu tarbimisega.<\/p>\n<p>Nagu sageli juhtub suurte projektide ulatuslike muutuste j\u00e4rel, ei t\u00f6\u00f6tanud esialgne versioon probleemideta. Siin tuli meile v\u00e4ga abiks Windowsi rakenduste silumisiteratorite tugi. Samm-sammult liikudes olime kevadeks 2017 (versioon 8.3.11 1C:Enterprise) migratsiooni l\u00f5petanud. <\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p>\n\u00dcleminek standardile C++14 v\u00f5ttis meil umbes 6 kuud. Enamiku ajast t\u00f6\u00f6tas projekti kallal \u00fcks (kuid v\u00e4ga kvalifitseeritud) arendaja, ning l\u00f5ppfaasis liitusid projektiga valdkondade esindajad \u2014 UI, serverikluster, arendus- ja haldustooted jne.<\/p>\n<p>\u00dcleminek lihtsustas meie t\u00f6\u00f6d uusimate versioonide standardisse migreerimisel. N\u00e4iteks versioon 1C:Enterprise 8.3.14 (arenduses, vabanemine on planeeritud j\u00e4rgmise aasta alguses) on juba standardile <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B17\">C++17<\/a><\/noindex>. <\/p>\n<p>P\u00e4rast migreerimist on arendajatel rohkem v\u00f5imalusi. Kui varem oli meil oma t\u00e4iendatud versioon STL-ist ja \u00fcks nimede ruum std, siis n\u00fc\u00fcd asuvad nimede ruumis std kompilatori sisseehitatud raamatukogude standardklassid, nimede ruumis stdx \u2013 meie, meie \u00fclesannete jaoks optimeeritud stringid ja konteinerid, boost-is \u2013 v\u00e4rske boost'i versioon. Ja arendaja kasutab neid klasse, mis sobivad tema \u00fclesannete lahendamiseks k\u00f5ige paremini. <\/p>\n<p>Arendamist aitab samuti ka \"looduslik\" reaaliseerimine liikumiseks konstruktoritest (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/move_constructor\">move constructors<\/a><\/noindex>) mitmete klasside jaoks. Kui klassil on liikumiseks konstruktor ja see klass paigutatakse konteinerisse, siis STL optimeerib elementide kopeerimist konteineri sees (n\u00e4iteks siis, kui konteiner laiendab ja tuleb muuta v\u00f5imsust ning reallocate (taask\u00e4itatav) m\u00e4lu). <\/p>\n<h3>T\u00f5rva lusikas<\/h3>\n<p>\nV\u00f5ib-olla k\u00f5ige ebameeldivam (aga mitte kriitiline) tagaj\u00e4rg migreerimisest \u2014 me oleme kokku puutunud obj-failide mahu suurenemisega <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C\">obj-failide<\/a><\/noindex>, ja kogu ehitusresultaat koos k\u00f5igi vahefailidega hakkas v\u00f5tma 60\u201370 GB. Selline k\u00e4itumine on seotud kaasaegsete standardraamatukogude erip\u00e4radega, mis on hakanud v\u00e4hem kriitiliselt suhtuma genereeritud abifailide mahusse. See ei m\u00f5juta kompileeritud rakenduse t\u00f6\u00f6d, kuid tekitab arenduses mitmeid ebamugavusi, sealhulgas pikendab kompileerimisaega. Suurenevad ka n\u00f5udmised vaba ruumi osas kettal ehitusteenustes ja arendajate masinates. Meie arendajad t\u00f6\u00f6tavad paralleelselt mitme platvormi versiooniga ning sadade gigabaitide vahefailid loomulikult toovad m\u00f5ningaid raskusi. Probleem on ebameeldiv, kuid mitte kriitiline, selle lahendamine on seni edasi l\u00fckatud. \u00dcheks v\u00f5imalikuks lahendusteks kaalume tehnikat <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Single_Compilation_Unit\">unity build<\/a><\/noindex> (seda kasutab n\u00e4iteks Google, kui ta arendab Chrome'i brauserit).<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/429678\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 (\u043e\u0441\u0435\u043d\u044c\u044e 2016), \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++14 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0431\u044b \u043d\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0439, \u043f\u0440\u043e\u0449\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0439, \u0443\u043f\u0440\u043e\u0449\u0430\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. \u0418 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u044d\u043a\u0441\u0442\u0440\u0430\u043e\u0440\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24270,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32466","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 (\u043e\u0441\u0435\u043d\u044c\u044e 2016), \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++14 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0431\u044b \u043d\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0439, \u043f\u0440\u043e\u0449\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0439, \u0443\u043f\u0440\u043e\u0449\u0430\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. \u0418 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u044d\u043a\u0441\u0442\u0440\u0430\u043e\u0440\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u043b\u0438 10 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 C++ \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 C++14 (\u0430 \u043f\u043e\u0442\u043e\u043c \u0438 \u043d\u0430 C++17) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 (\u043e\u0441\u0435\u043d\u044c\u044e 2016), \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++14 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0431\u044b \u043d\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0439, \u043f\u0440\u043e\u0449\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0439, \u0443\u043f\u0440\u043e\u0449\u0430\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. \u0418 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u044d\u043a\u0441\u0442\u0440\u0430\u043e\u0440\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:47:13+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:47:13+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kuidas me t\u00f5lkisime 10 miljonit rida C++ koodi \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 C++14-le (ja hiljem C++17-le) | ProHoster","description":"M\u00f5nda aega tagasi (2016. aasta s\u00fcgisel) tekkis 1C:Enterprise tehnoloogilise platvormi j\u00e4rgmise versiooni arendamise k\u00e4igus arendusmeeskonnas k\u00fcsimus C++14 uue standardi toetamise osas meie koodis. \u00dcleminek uuele standardile, nagu me eelnevalt arvasime, v\u00f5imaldaks meil paljusid asju elegantsemalt, lihtsamalt ja usaldusv\u00e4\u00e4rsemalt kirjutada, lihtsustades koodi toetamist ja hooldamist. Ja t\u00f5lkes ei tundu olevat midagi erakordset,","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u043b\u0438 10 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 C++ \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 C++14 (\u0430 \u043f\u043e\u0442\u043e\u043c \u0438 \u043d\u0430 C++17) | ProHoster","og:description":"\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434 (\u043e\u0441\u0435\u043d\u044c\u044e 2016), \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 C++14 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0431\u044b \u043d\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0435\u0449\u0438 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0435\u0439, \u043f\u0440\u043e\u0449\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0439, \u0443\u043f\u0440\u043e\u0449\u0430\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430. \u0418 \u0432 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u044d\u043a\u0441\u0442\u0440\u0430\u043e\u0440\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e,","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:47:13+00:00","article:modified_time":"2019-10-31T18:47:13+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32466","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:00:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:58:23","updated":"2026-01-21 11:00:20"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=32466"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/32466\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/24270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=32466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=32466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=32466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}