{"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 rida C++ koodi standardile C++14 (ja hiljem C++17)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u00f5ni aeg tagasi (s\u00fcgisel 2016) tekkis 1C:Enterprise tehnoloogilise platvormi j\u00e4rgmise versiooni arendamise k\u00e4igus arendustiimis k\u00fcsimus uue standardi toetamisest <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B14\">C++14<\/a><\/noindex> meie koodis. \u00dcleminek uuele standardile, nagu me eeldasime, v\u00f5imaldaks meil kirjutada paljusid asju elegantselt, lihtsalt ja usaldusv\u00e4\u00e4rselt ning lihtsustaks koodi hooldust ja toetust. T\u00f5lkes ei paista olevat midagi erakordset, kui mitte arvestada koodibaasi ulatust ja meie koodi spetsiifilisi jooni.<\/p>\n<p>Neile, kes ei tea, 1C:Enterprise on keskkond kiireks ristplatvormiliste \u00e4rirakenduste arendamiseks ja nende k\u00e4itamiseks erinevates operatsioonis\u00fcsteemides ja andmebaasides. Toote koosseisus on \u00fcldiselt:<\/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 Windowsis ja Linuxis<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000124.htm\">Kliendi<\/a><\/noindex>, suhtleb serveriga http(s) kaudu v\u00f5i oma binaarse protokolli kaudu, t\u00f6\u00f6tab Windowsis, Linuxis, macOS-is<\/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 (kirjeldatud JavaScriptis)<\/li>\n<li>Arenduskeskkond (<noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000008.htm\">Konfigureerija<\/a><\/noindex>), t\u00f6\u00f6tab Windowsis, Linuxis, macOS-is<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000813.htm\">Administreerimist\u00f6\u00f6riistad<\/a><\/noindex> rakenduste serverite jaoks, t\u00f6\u00f6tavad Windowsis, Linuxis, macOS-is<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/mobilnyy-klient\/\">Mobiiliklient<\/a><\/noindex>, \u00fchendub serveriga http(s) kaudu, t\u00f6\u00f6tab mobiilseadmetes Androidi, iOSi, Windowsi all<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/283198\/\">Mobiiliplatvorm<\/a><\/noindex> \u2014 raamistik \u043e\u0444\u0444\u043b\u0430\u0438\u043d mobiilirakenduste loomiseks, millel on s\u00fcnkroniseerimise v\u00f5imalus, t\u00f6\u00f6tavad Androidis, iOSis, Windowsis<\/li>\n<li>Arenduskeskkond <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/IDE\/\">1C:Enterprise Development Tools<\/a><\/noindex>, on 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 \u2014 serveri koodibaas on 99% jagatud, kliendi oma umbes 95%. Tehnoloogiline platvorm 1C:Enterprise on peamiselt kirjutatud C++ keeles ja allpool on ligikaudsed koodi omadused:<\/p>\n<ul>\n<li>10 miljonit rida C++ koodi,<\/li>\n<li>14 tuhat faili,<\/li>\n<li>60 tuhat klassi,<\/li>\n<li>pool miljonit meetodit.<\/li>\n<\/ul>\n<p>\nJa see k\u00f5ik tuli viia C++14 peale. T\u00e4na r\u00e4\u00e4gime, kuidas me seda tegime ja millega me protsessi k\u00e4igus kokku puutusime.<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas me t\u00f5lkisime 10 miljonit rida C++ koodi standardile C++14 (ja hiljem C++17)\" 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>M\u00e4rkus<\/h3>\n<p>\nAll that is written below about the slow\/fast performance and (not) significant memory consumption of standard class implementations in various libraries means one thing: this is true FOR US. It is quite possible that standard implementations are best suited for your tasks. We, however, based our conclusions on our own tasks: we took typical data from our clients, ran standard scenarios on them, observed their performance, memory consumption, etc., and analyzed whether we and our clients were satisfied with such results or not. And we acted accordingly.<\/p>\n<h3>What We Had<\/h3>\n<p>\nInitially, we wrote the code for the 1C:Enterprise 8 platform in Microsoft Visual Studio. The project started in the early 2000s, and we only had a version for Windows. Naturally, the code has significantly evolved since then, and many mechanisms have been completely rewritten. However, the code was written according to the standards of 1998, and, for example, right angle brackets were separated by spaces to ensure 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 platform version 8.1, we began supporting Linux and switched to a third-party standard library <noindex><a rel=\"nofollow\" href=\"http:\/\/www.stlport.org\/\">STLPort<\/a><\/noindex>. One of the reasons for the transition was working with wide strings. In our code, we widely use std::wstring, based on the wchar_t type. Its size is 2 bytes in Windows, but by default 4 bytes in Linux. This led to incompatibility in our binary protocols between client and server, as well as various persistent data. The gcc options can specify that the size of wchar_t during compilation should also be 2 bytes, but then you can forget about using the standard library from the compiler, as it uses glibc, which in turn is compiled for a 4-byte wchar_t. Other reasons included a better implementation of standard classes, support for hash tables, and even emulation of move semantics within containers, which we actively used. And another reason, as they say, last but not least, was the performance of strings. We had our own class for strings, as, due to the specifics of our software, string operations are used very widely and are critical for us. <\/p>\n<p>Our string is based on ideas for string optimization expressed back in the early 2000s <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\">by Andrei Alexandrescu<\/a><\/noindex>. Hiljem, kui Alexandrescu t\u00f6\u00f6tas Facebookis, kasutati tema algatusel Facebooki mootoris rida, mis toimib sarnaste p\u00f5him\u00f5tete alusel (vt raamatukogu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/folly\">folly<\/a><\/noindex>).<\/p>\n<p>Meie reas kasutati kahte peamist optimeerimistehnoloogiat:<\/p>\n<ol>\n<li>L\u00fchikeste v\u00e4\u00e4rtuste jaoks kasutatakse sisemist puhvrit stringi objekti sees (mis ei vaja t\u00e4iendavat m\u00e4lu eraldamist).<\/li>\n<li>K\u00f5ikide teiste puhul kasutatakse mehhanismi <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, omistamisel\/muundamisel kasutatakse viidete arvestust.<\/li>\n<\/ol>\n<p>\nKuna me tahtsime platvormi kompileerimist kiirendada, j\u00e4tsime oma STLPorti variandist v\u00e4lja streami teostuse (mida me ei kasutanud), see andis meile kompileerimise kiiruset\u00f5usu umbes 20%. Hiljem pidime piiratud m\u00e4\u00e4ral kasutama <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Boost\">Boost<\/a><\/noindex>. Boost kasutab aktiivselt streami, eriti oma teenuste API-des (n\u00e4iteks logimise jaoks), seet\u00f5ttu pidime seda modifitseerima, v\u00e4listades streami kasutamise. See omakorda raskendas meil \u00fcleminekut uutele Boosti versioonidele. <\/p>\n<h3>Kolmas tee<\/h3>\n<p>\nC++14 standardile \u00fcleminekul kaalume selliseid v\u00f5imalusi:<\/p>\n<ol>\n<li>T\u00f5sta meie modifitseeritud STLPort C++14 standardile. See valik on v\u00e4ga keeruline, kuna STLPorti toetamist l\u00f5petati 2010. aastal ja kogu selle koodi t\u00f5stmine tuli meil iseseisvalt teha.<\/li>\n<li>\u00dcleminek teisele STL-i teostusele, mis oleks C++14 \u00fchilduv. Eriti soovitav oleks, et see teostus oleks Windowsis ja Linuxis.<\/li>\n<li>Kasutada iga ops\u00fcsteemi kompileerimisel vastava kompilaatori sisseehitatud teeki.<\/li>\n<\/ol>\n<p>\nEsimene valik l\u00fckati kohe tagasi liiga suure t\u00f6\u00f6mahu t\u00f5ttu.<\/p>\n<p>M\u00f5tlesime m\u00f5nda aega teisele valikule; kandidaadina kaalume <noindex><a rel=\"nofollow\" href=\"https:\/\/libcxx.llvm.org\/\">libc++<\/a><\/noindex>, kuid sel hetkel ei t\u00f6\u00f6tanud see Windowsis. libc++ portimiseks Windowsile peaks palju t\u00f6\u00f6d tegema \u2014 n\u00e4iteks kirjutama ise k\u00f5ik, mis puudutab niite, niitide s\u00fcnkroniseerimist ja aatomilisust, 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 valisime kolmanda tee.<\/p>\n<h3>\u00dcleminek<\/h3>\n<p>\nNii et meie \u00fclesanne oli asendada STLPorti kasutamine vastava kompilaatori teekidega (Visual Studio 2015 Windowsi jaoks, gcc 7 Linuxi jaoks, clang 8 macOS-i jaoks). <\/p>\n<p>\u00d5nneks kirjutati meie kood p\u00f5hiliselt vastavalt juhistele ja ei kasutatud igasuguseid nutikaid trikke, seega migrations uutele raamatukogudele kulges suhteliselt sujuvalt, skriptide abil, mis asendasid algfailides t\u00fc\u00fcpide, klasside, nimede ja sissetoodud elementide nimed. Migratsioon puudutas 10 000 algfaili (14 000-st). wchar_t asendati char16_t-ga; otsustasime loobuda wchar_t kasutamisest, kuna char16_t peab k\u00f5ikides operatsioonis\u00fcsteemides 2 baiti ja ei riku koodi \u00fchilduvust Windowsi ja Linuxi vahel.<\/p>\n<p>Ei m\u00f6\u00f6dunud ka v\u00e4ikeste seiklusteta. N\u00e4iteks STLPortis sai iteratorit kaudsetena lihtsalt elementide pointeriks castida, ja meie koodi m\u00f5nes kohas seda ka kasutati. Uutes raamatukogudes ei saanud seda enam teha, ja neid kohti tuli anal\u00fc\u00fcsida ja k\u00e4sitsi \u00fcmber kirjutada. <\/p>\n<p>Nii et koodi migratsioon on l\u00f5ppenud, kood kompileerub k\u00f5ikidele operatsioonis\u00fcsteemidele. On aeg testideks. <\/p>\n<p>\u00dcleminekuj\u00e4rgsed testid n\u00e4itasid j\u00f5udluse langust (kohati kuni 20-30%) ja suurenenud m\u00e4lutarvet (kuni 10-15%) v\u00f5rreldes vana koodi versiooniga. See oli osaliselt seotud standardsete stringide mitteoptimaalse toimimisega. Seega pidime j\u00e4lle oma stringe kasutama, pisut kohandatuna. <\/p>\n<p>Samuti tuli v\u00e4lja huvitav aspekt konteinerite rakendamisest sisseehitatud raamatukogudes: t\u00fchjad (ilma elementideta) std::map ja std::set sisseehitatud raamatukogudest eraldavad m\u00e4lu. Ja meie koodis loodi teatud kohtades \u00fcsna palju selliseid t\u00fchje konteinerite t\u00fc\u00fcpe. Standardsete konteinerite eraldusm\u00e4lu oli veidi, \u00fche juurelemendi jaoks, kuid meie jaoks osutus see kriitiliseks \u2013 mitmete stsenaariumitega langes meie j\u00f5udlus ja suurenes m\u00e4lu tarbimine (STLPortiga v\u00f5rreldes). Seet\u00f5ttu asendasime meie koodis need kaks t\u00fc\u00fcpi konteinerit sisseehitatud raamatukogudest Boosti rakendusega, kus need konteinerid ei omanud sellist omadust, ja see lahendas aeglustumise ja suurenenud m\u00e4lu tarbimise probleemi.<\/p>\n<p>Nagu sageli juhtub suurtel muudatustel suurtes projektides, esimene allikate versioon ei t\u00f6\u00f6tanud probleemideta ja siin tulid meile v\u00e4ga abiks, sealhulgas Windowsi rakenduse silumisi iteratorite tugi. Samm-sammult liikusime edasi ning 2017. aasta kevadel (versioon 8.3.11 1C:\u00c4ri) oli migratsioon l\u00f5ppenud. <\/p>\n<h3>Summary<\/h3>\n<p>\nC++14 standard transition took us about 6 months. Most of the time, a single highly qualified developer worked on the project, and at the final stage, team representatives responsible for specific areas\u2014UI, server cluster, development and administration tools, etc.\u2014joined in.<\/p>\n<p>The transition greatly simplified our migration to the latest versions of the standard. The version 1C:Enterprise 8.3.14 (in development, release planned for early next year) has already been translated to the standard. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B17\">C++17<\/a><\/noindex>. <\/p>\n<p>After the migration, developers have more opportunities. Previously, we had our own modified version of STL and one namespace std, but now standard classes from the compiler's built-in libraries reside in namespace std, while our optimized strings and containers for our tasks are in namespace stdx, and the fresh version of boost is in boost. Developers use the classes that are optimally suited for solving their tasks. <\/p>\n<p>The 'native' implementation of move constructors also helps in development (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/move_constructor\">move constructors<\/a><\/noindex>) for some classes. If a class has a move constructor and this class is placed in a container, STL optimizes the copying of elements within the container (for instance, when the container expands and needs to change capacity and reallocate memory). <\/p>\n<h3>A fly in the ointment<\/h3>\n<p>\nPerhaps the most unpleasant (but not critical) consequence of the migration is that we encountered an increase in the volume of <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 files<\/a><\/noindex>, and the full result of the build with all intermediate files took up 60 to 70 GB. This behavior is related to the peculiarities of modern standard libraries, which have become less critical regarding the volume of generated auxiliary files. It does not affect the operation of the compiled application, but creates a number of inconveniences in development, particularly increasing compilation time. It also raises the requirements for free disk space on build servers and developers' machines. Our developers are working on several platform versions simultaneously, and hundreds of gigabytes of intermediate files sometimes create difficulties in work. This issue is unpleasant but not critical, and we have postponed its resolution for now. One of the potential solutions we are considering is the technique of <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Single_Compilation_Unit\">unity build<\/a><\/noindex> (seda, sealhulgas kasutab Google oma Chrome'i brauseri arendamisel).<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 5.0.1.1 - 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\" \/>\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) 5.0.1.1\" \/>\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\" \/>\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 t\u00f5lkisime 10 miljonit C++ koodi rida standardsesse C++14 (ja siis C++17) | ProHoster","description":"M\u00f5ni aeg tagasi (s\u00fcgisel 2016) tekkis 1C:Enterprise tehnoloogilise platvormi j\u00e4rgmise versiooni arendamise k\u00e4igus arendustiimis k\u00fcsimus uue standardi toetamisest","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","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}