{"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\/cs\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17","title":{"rendered":"Jak jsme p\u0159elo\u017eili 10 milion\u016f \u0159\u00e1dk\u016f k\u00f3du C++ na standard C++14 (a pot\u00e9 i na C++17)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>N\u011bjakou dobu zp\u011bt (na podzim 2016) do\u0161lo b\u011bhem v\u00fdvoje dal\u0161\u00ed verze technologick\u00e9 platformy 1C:Enterprise k ot\u00e1zce podpory nov\u00e9ho standardu <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B14\">C++14<\/a><\/noindex> v na\u0161em k\u00f3du. P\u0159echod na nov\u00fd standard, jak jsme p\u0159edpokl\u00e1dali, by n\u00e1m umo\u017enil ps\u00e1t mnoh\u00e9 v\u011bci elegantn\u011bji, jednodu\u0161eji a spolehliv\u011bji, zjednodu\u0161oval by podporu a \u00fadr\u017ebu k\u00f3du. A v p\u0159ekladu nen\u00ed nic zvl\u00e1\u0161tn\u00edho, pokud bychom nezohlednili rozsah k\u00f3dov\u00e9 z\u00e1kladny a specifick\u00e9 vlastnosti na\u0161eho k\u00f3du.<\/p>\n<p>Pro ty, kte\u0159\u00ed nev\u00ed, 1C:Enterprise je prost\u0159ed\u00ed pro rychl\u00fd v\u00fdvoj multiplatformn\u00edch byznys aplikac\u00ed a runtime pro jejich prov\u00e1d\u011bn\u00ed na r\u016fzn\u00fdch opera\u010dn\u00edch syst\u00e9mech a DBMS. V obecn\u00fdch rysech zahrnuje produkt:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000885.htm\">Klastr aplika\u010dn\u00edch server\u016f<\/a><\/noindex>, funguje na Windows a Linuxu<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000124.htm\">Z\u00e1kazn\u00edk<\/a><\/noindex>, pracuj\u00edc\u00ed se serverem p\u0159es http(s) nebo p\u0159es vlastn\u00ed bin\u00e1rn\u00ed protokol, funguje na Windows, Linuxu, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/315414\/\">Webov\u00fd klient<\/a><\/noindex>, funguj\u00edc\u00ed v prohl\u00ed\u017ee\u010d\u00edch Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari (naps\u00e1no v JavaScriptu)<\/li>\n<li>V\u00fdvojov\u00e9 prost\u0159ed\u00ed (<noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000008.htm\">Konfigur\u00e1tor<\/a><\/noindex>), funguje na Windows, Linuxu, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000813.htm\">Administra\u010dn\u00ed n\u00e1stroje<\/a><\/noindex> aplika\u010dn\u00edch server\u016f, funguj\u00ed na Windows, Linuxu, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/mobilnyy-klient\/\">Mobiln\u00ed klient<\/a><\/noindex>, p\u0159ipojuj\u00edc\u00ed se k serveru p\u0159es http(s), funguje na mobiln\u00edch za\u0159\u00edzen\u00edch s Androidem, iOS, Windows<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/283198\/\">Mobiln\u00ed platforma<\/a><\/noindex> \u2014 framework pro vytv\u00e1\u0159en\u00ed offline mobiln\u00edch aplikac\u00ed se schopnost\u00ed synchronizace, funguj\u00edc\u00edch na Androidu, iOS, Windows<\/li>\n<li>V\u00fdvojov\u00e9 prost\u0159ed\u00ed <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/IDE\/\">1C:Enterprise Development Tools<\/a><\/noindex>, napsan\u00e1 v Jav\u011b<\/li>\n<li>Server <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/422903\/\">Syst\u00e9my interakce<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nSna\u017e\u00edme se ps\u00e1t co nejv\u00edce jeden k\u00f3d pro r\u016fzn\u00e9 OS \u2014 k\u00f3dov\u00e1 z\u00e1kladna serveru je spole\u010dn\u00e1 z 99 %, klienta p\u0159ibli\u017en\u011b z 95 %. Technologick\u00e1 platforma 1C:Enterprise je p\u0159ev\u00e1\u017en\u011b napsan\u00e1 v C++ a n\u00ed\u017ee uveden\u00e9 jsou p\u0159ibli\u017en\u00e9 charakteristiky k\u00f3du:<\/p>\n<ul>\n<li>10 milion\u016f \u0159\u00e1dk\u016f C++ k\u00f3du,<\/li>\n<li>14 tis\u00edc soubor\u016f,<\/li>\n<li>60 tis\u00edc t\u0159\u00edd,<\/li>\n<li>p\u016fl milionu metod.<\/li>\n<\/ul>\n<p>\nA to v\u0161echno bylo pot\u0159eba p\u0159ev\u00e9st na C++14. O tom, jak jsme to d\u011blali a s \u010d\u00edm jsme se setkali v procesu, v\u00e1m dnes pov\u00edme.<\/p>\n<p><img decoding=\"async\" alt=\"Jak jsme p\u0159elo\u017eili 10 milion\u016f \u0159\u00e1dk\u016f k\u00f3du C++ na standard C++14 (a pot\u00e9 i na 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>Vylou\u010den\u00ed odpov\u011bdnosti<\/h3>\n<p>\nV\u0161e, co je n\u00ed\u017ee naps\u00e1no o pomal\u00e9\/r\u00fdchl\u00e9 pr\u00e1ci, (ne)mal\u00e9 spot\u0159eb\u011b pam\u011bti standardn\u00edch t\u0159\u00edd v r\u016fzn\u00fdch knihovn\u00e1ch, znamen\u00e1 jedno: plat\u00ed to PRO N\u00c1S. Je mo\u017en\u00e9, \u017ee pro va\u0161e \u00fakoly budou standardn\u00ed implementace ty nejlep\u0161\u00ed. My jsme se v\u0161ak odv\u00edjeli od na\u0161ich pot\u0159eb: brali jsme typick\u00e9 \u00fadaje na\u0161ich klient\u016f, testovali jsme je na typick\u00fdch sc\u00e9n\u00e1\u0159\u00edch, sledovali jsme v\u00fdkon, spot\u0159ebu pam\u011bti atd., a analyzovali, zda n\u00e1s a na\u0161e klienty tyto v\u00fdsledky uspokojuj\u00ed, nebo ne. A podle toho jsme se rozhodovali.<\/p>\n<h3>Co jsme m\u011bli<\/h3>\n<p>\nP\u016fvodn\u011b jsme psali k\u00f3d platformy 1C:Enterprise 8 v Microsoft Visual Studio. Projekt za\u010dal za\u010d\u00e1tkem 2000. let a my jsme m\u011bli verzi pouze pro Windows. Samoz\u0159ejm\u011b, od t\u00e9 doby se k\u00f3d aktivn\u011b rozv\u00edjel, mnoh\u00e9 mechanismy byly zcela p\u0159epracov\u00e1ny. Ale k\u00f3d byl ps\u00e1n podle standardu z roku 1998, a nap\u0159\u00edklad prav\u00e9 \u00fahlov\u00e9 z\u00e1vorky byly odd\u011bleny mezerami, aby \u00fasp\u011b\u0161n\u011b pro\u0161la kompilace, vypadalo to takto:<\/p>\n<pre><code class=\"cpp\">vector&lt;vector &gt; IntV;<\/code><\/pre>\n<p>\nV roce 2006, s vyd\u00e1n\u00edm verze platformy 8.1, jsme za\u010dali podporovat Linux a p\u0159e\u0161li jsme na extern\u00ed standardn\u00ed knihovnu <noindex><a rel=\"nofollow\" href=\"http:\/\/www.stlport.org\/\">STLPort<\/a><\/noindex>. Jedn\u00edm z d\u016fvod\u016f p\u0159echodu byla pr\u00e1ce s \u0161irok\u00fdmi \u0159et\u011bzci. V na\u0161em k\u00f3du b\u011b\u017en\u011b pou\u017e\u00edv\u00e1me std::wstring, zalo\u017een\u00fd na typu wchar_t. Jeho velikost ve Windows je 2 bajty, zat\u00edmco v Linuxu je ve v\u00fdchoz\u00edm nastaven\u00ed 4 bajty. To vedlo k nekompatibilit\u011b na\u0161ich bin\u00e1rn\u00edch protokol\u016f mezi klientem a serverem, stejn\u011b jako r\u016fzn\u00fdch trval\u00fdch dat. Mo\u017enostmi gcc lze ur\u010dit, aby velikost wchar_t p\u0159i kompilaci byla tak\u00e9 2 bajty, ale pak se m\u016f\u017eete rozlou\u010dit s pou\u017e\u00edv\u00e1n\u00edm standardn\u00ed knihovny od p\u0159eklada\u010de, proto\u017ee ta pou\u017e\u00edv\u00e1 glibc, kter\u00e1 byla naopak zkompilov\u00e1na pro 4-bajtov\u00fd wchar_t. Dal\u0161\u00edmi d\u016fvody byly kvalitn\u011bj\u0161\u00ed implementace standardn\u00edch t\u0159\u00edd, podpora hash tabulek a dokonce i emulace p\u0159esunov\u00e9 semantiky uvnit\u0159 kontejner\u016f, kterou jsme aktivn\u011b pou\u017e\u00edvali. A posledn\u00edm, ale nem\u00e9n\u011b d\u016fle\u017eit\u00fdm d\u016fvodem, byla v\u00fdkonov\u00e1 str\u00e1nka \u0159et\u011bzc\u016f. M\u011bli jsme svou vlastn\u00ed t\u0159\u00eddu pro \u0159et\u011bzce, proto\u017ee vzhledem k specifik\u016fm na\u0161eho softwaru se \u0159et\u011bzcov\u00e9 operace pou\u017e\u00edvaj\u00ed velmi \u0161iroce a pro n\u00e1s to bylo kritick\u00e9. <\/p>\n<p>N\u00e1\u0161 \u0159et\u011bzec je zalo\u017een na my\u0161lenk\u00e1ch optimalizace \u0159et\u011bzc\u016f, kter\u00e9 byly vy\u0159\u010deny ji\u017e na za\u010d\u00e1tku 2000. let <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\">Andrej Alexandrescu<\/a><\/noindex>. Pozd\u011bji, kdy\u017e Alexandrescu pracoval ve Facebooku, na jeho podn\u011bt byla v engine Facebooku pou\u017eita \u0159ada, kter\u00e1 pracovala na podobn\u00fdch principech (viz knihovna <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/folly\">folly<\/a><\/noindex>).<\/p>\n<p>. V na\u0161\u00ed \u0159ad\u011b byly pou\u017eity dv\u011b hlavn\u00ed optimaliza\u010dn\u00ed technologie:<\/p>\n<ol>\n<li>Pro kr\u00e1tk\u00e9 hodnoty se pou\u017e\u00edv\u00e1 intern\u00ed vyrovn\u00e1vac\u00ed pam\u011b\u0165 p\u0159\u00edmo v objektu \u0159et\u011bzce (kter\u00e1 nevy\u017eaduje dal\u0161\u00ed alokaci pam\u011bti).<\/li>\n<li>Pro v\u0161echny ostatn\u00ed se pou\u017e\u00edv\u00e1 mechanika <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>. Hodnota \u0159et\u011bzce je uchov\u00e1v\u00e1na na jednom m\u00edst\u011b, p\u0159i p\u0159i\u0159azen\u00ed\/modifikaci se pou\u017e\u00edv\u00e1 po\u010d\u00edtadlo odkaz\u016f.<\/li>\n<\/ol>\n<p>\nAbychom urychlili kompilaci platformy, vylou\u010dili jsme ze sv\u00e9 varianty STLPort implementaci streamu (kterou jsme nepou\u017e\u00edvali), co\u017e n\u00e1m dalo urychlen\u00ed kompilace p\u0159ibli\u017en\u011b o 20 %. Pozd\u011bji jsme museli omezen\u011b pou\u017e\u00edvat <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Boost\">Boost<\/a><\/noindex>, Boost aktivn\u011b vyu\u017e\u00edv\u00e1 stream, zejm\u00e9na ve sv\u00fdch API slu\u017eeb (nap\u0159. pro logov\u00e1n\u00ed), tak\u017ee jsme museli jeho modifikovat, abychom vylou\u010dili jeho pou\u017eit\u00ed streamu. To n\u00e1m na opl\u00e1tku zt\u011b\u017eovalo p\u0159echod na nov\u00e9 verze Boost. <\/p>\n<h3>T\u0159et\u00ed cesta<\/h3>\n<p>\nP\u0159i p\u0159echodu na standard C++14 jsme zva\u017eovali n\u00e1sleduj\u00edc\u00ed varianty:<\/p>\n<ol>\n<li>Zvednout n\u00e1mi modifikovan\u00fd STLPort na standard C++14. Mo\u017enost je velmi slo\u017eit\u00e1, proto\u017ee podpora STLPort byla ukon\u010dena v roce 2010 a cel\u00fd jeho k\u00f3d bychom museli zvednout sami.<\/li>\n<li>P\u0159ej\u00edt na jinou implementaci STL kompatibiln\u00ed s C++14. Je vysoce \u017e\u00e1douc\u00ed, aby tato implementace byla pod Windows a Linux.<\/li>\n<li>Pou\u017e\u00edt p\u0159i kompilaci knihovnu zabudovanou do odpov\u00eddaj\u00edc\u00edho kompil\u00e1toru pro ka\u017edou OS.<\/li>\n<\/ol>\n<p>\nPrvn\u00ed varianta byla hned zam\u00edtnuta kv\u016fli p\u0159\u00edli\u0161 velk\u00e9mu objemu pr\u00e1ce.<\/p>\n<p>N\u011bjakou dobu jsme p\u0159em\u00fd\u0161leli o druh\u00e9 variant\u011b; jako kandid\u00e1ta jsme zva\u017eovali <noindex><a rel=\"nofollow\" href=\"https:\/\/libcxx.llvm.org\/\">libc++<\/a><\/noindex>, ale ten v t\u00e9 dob\u011b nefungoval pod Windows. Aby bylo mo\u017en\u00e9 portovat libc++ na Windows, bylo by nutn\u00e9 ud\u011blat spoustu pr\u00e1ce \u2013 nap\u0159\u00edklad napsat sami v\u0161e, co se t\u00fdk\u00e1 vl\u00e1ken, synchronizace vl\u00e1ken a atomicity, proto\u017ee v libc++ se v t\u011bchto oblastech pou\u017e\u00edvalo <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/POSIX\">POSIX API<\/a><\/noindex>.<\/p>\n<p>A zvolili jsme t\u0159et\u00ed cestu.<\/p>\n<h3>P\u0159echod<\/h3>\n<p>\nTak\u017ee jsme museli nahradit pou\u017eit\u00ed STLPort knihovnami odpov\u00eddaj\u00edc\u00edch kompil\u00e1tor\u016f (Visual Studio 2015 pro Windows, gcc 7 pro Linux, clang 8 pro macOS). <\/p>\n<p>Na\u0161t\u011bst\u00ed byl n\u00e1\u0161 k\u00f3d ps\u00e1n v\u011bt\u0161inou podle doporu\u010den\u00ed a nevyu\u017e\u00edval \u017e\u00e1dn\u00e9 slo\u017eit\u00e9 triky, tak\u017ee migrace na nov\u00e9 knihovny prob\u00edhala relativn\u011b hladce, s pomoc\u00ed skript\u016f, kter\u00e9 v p\u016fvodn\u00edch souborech nahrazovaly n\u00e1zvy typ\u016f, t\u0159\u00edd, jmenn\u00fdch prostor\u016f a zahrnut\u00ed. Migrace se dotkla 10 000 p\u016fvodn\u00edch soubor\u016f (z 14 000). wchar_t byl nahrazen char16_t; rozhodli jsme se p\u0159estat pou\u017e\u00edvat wchar_t, jeliko\u017e char16_t zab\u00edr\u00e1 na v\u0161ech OS 2 bajty a nezhor\u0161uje kompatibilitu k\u00f3du mezi Windows a Linuxem.<\/p>\n<p>Neobe\u0161lo se to bez drobn\u00fdch dobrodru\u017estv\u00ed. Nap\u0159\u00edklad v STLPort bylo mo\u017en\u00e9 neexplicitn\u011b p\u0159etypovat iter\u00e1tor na ukazatel na prvek, a v n\u011bkter\u00fdch m\u00edstech na\u0161eho k\u00f3du se to pou\u017e\u00edvalo. V nov\u00fdch knihovn\u00e1ch to ji\u017e nebylo mo\u017en\u00e9, a tato m\u00edsta jsme museli analyzovat a p\u0159episovat ru\u010dn\u011b. <\/p>\n<p>Tak\u017ee migrace k\u00f3du byla dokon\u010dena, k\u00f3d se kompiluje pro v\u0161echny OS. Nyn\u00ed p\u0159i\u0161el \u010das na testy. <\/p>\n<p>Testy po p\u0159echodu uk\u00e1zaly pokles v\u00fdkonnosti ( m\u00edsty a\u017e o 20-30%) a zv\u00fd\u0161en\u00ed spot\u0159eby pam\u011bti (a\u017e o 10-15%) ve srovn\u00e1n\u00ed se starou verz\u00ed k\u00f3du. To bylo \u010d\u00e1ste\u010dn\u011b spojeno s neoptim\u00e1ln\u00ed prac\u00ed standardn\u00edch \u0159et\u011bzc\u016f. Proto jsme op\u011bt museli pou\u017e\u00edt vlastn\u00ed, m\u00edrn\u011b upravenou, \u0159et\u011bzcovou t\u0159\u00eddu. <\/p>\n<p>Tak\u00e9 se uk\u00e1zala zaj\u00edmav\u00e1 vlastnost implementace kontejner\u016f ve zabudovan\u00fdch knihovn\u00e1ch: pr\u00e1zdn\u00e9 (bez prvk\u016f) std::map a std::set z vestav\u011bn\u00fdch knihoven alokuj\u00ed pam\u011b\u0165. A u n\u00e1s se kv\u016fli zvl\u00e1\u0161tnostem implementace v n\u011bkter\u00fdch m\u00edstech k\u00f3du vytv\u00e1\u0159\u00ed docela hodn\u011b pr\u00e1zdn\u00fdch kontejner\u016f tohoto typu. Standardn\u00ed kontejnery alokuj\u00ed pam\u011b\u0165 trochu, pro jeden ko\u0159enov\u00fd prvek, ale pro n\u00e1s to bylo kritick\u00e9 \u2013 v n\u011bkolika sc\u00e9n\u00e1\u0159\u00edch n\u00e1m v\u00fdrazn\u011b poklesla v\u00fdkonnost a vzrostla spot\u0159eba pam\u011bti (ve srovn\u00e1n\u00ed se STLPort). Proto jsme v na\u0161em k\u00f3du nahradili tyto dva typy kontejner\u016f z vestav\u011bn\u00fdch knihoven jejich implementac\u00ed od Boost, kde tyto kontejnery nem\u011bly takovou zvl\u00e1\u0161tnost, a to vy\u0159e\u0161ilo probl\u00e9m se zpomalen\u00edm a zv\u00fd\u0161enou spot\u0159ebou pam\u011bti.<\/p>\n<p>Jak u\u017e to b\u00fdv\u00e1 po rozs\u00e1hl\u00fdch zm\u011bn\u00e1ch ve velk\u00fdch projektech, prvn\u00ed iterace zdrojov\u00e9ho k\u00f3du nefungovala bez probl\u00e9m\u016f a zde n\u00e1m velmi pomohla mimo jin\u00e9 podpora ladic\u00edch iter\u00e1tor\u016f v implementaci pro Windows. Krok za krokem jsme se posouvali vp\u0159ed, a na ja\u0159e 2017 (verze 8.3.11 1C:Enterprise) byla migrace dokon\u010dena. <\/p>\n<h3>Z\u00e1v\u011bry<\/h3>\n<p>\nP\u0159echod na standard C++14 n\u00e1m zabral asi 6 m\u011bs\u00edc\u016f. V\u011bt\u0161inu \u010dasu na projektu pracoval jedin\u00fd (ale velmi kvalifikovan\u00fd) v\u00fdvoj\u00e1\u0159, na fin\u00e1ln\u00ed f\u00e1zi se p\u0159ipojili z\u00e1stupci t\u00fdm\u016f odpov\u011bdn\u00fdch za konkr\u00e9tn\u00ed oblasti \u2014 UI, serverov\u00e9 klastrov\u00e1n\u00ed, v\u00fdvojov\u00e9 a administrativn\u00ed n\u00e1stroje atd.<\/p>\n<p>P\u0159echod n\u00e1m v\u00fdrazn\u011b usnadnil pr\u00e1ci na migraci na nejnov\u011bj\u0161\u00ed verze standardu. Nap\u0159\u00edklad verze 1C:Enterprise 8.3.14 (ve v\u00fdvoji, vyd\u00e1n\u00ed pl\u00e1nov\u00e1no na za\u010d\u00e1tek p\u0159\u00ed\u0161t\u00edho roku) ji\u017e byla p\u0159evedena na standard. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B17\">C++17<\/a><\/noindex>. <\/p>\n<p>Po migraci m\u011bli v\u00fdvoj\u00e1\u0159i v\u00edce mo\u017enost\u00ed. Pokud jsme d\u0159\u00edve pou\u017e\u00edvali na\u0161i upravenou verzi STL a jeden jmenn\u00fd prostor std, nyn\u00ed m\u00e1me ve jmenn\u00e9m prostoru std standardn\u00ed t\u0159\u00eddy z vestav\u011bn\u00fdch knihoven kompil\u00e1toru, v jmenn\u00e9m prostoru stdx \u2013 na\u0161e optimalizovan\u00e9 \u0159et\u011bzce a kontejnery pro na\u0161e \u00fakoly, a v boost \u2013 nejnov\u011bj\u0161\u00ed verzi boost. A v\u00fdvoj\u00e1\u0159 pou\u017e\u00edv\u00e1 ty t\u0159\u00eddy, kter\u00e9 optim\u00e1ln\u011b vyhovuj\u00ed jeho \u00fakol\u016fm. <\/p>\n<p>Pom\u00e1h\u00e1 p\u0159i v\u00fdvoji tak\u00e9 \u201edom\u00e1c\u00ed\u201c implementace konstruktor\u016f pohybu (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/move_constructor\">move constructors<\/a><\/noindex>) pro \u0159adu t\u0159\u00edd. Pokud m\u00e1 t\u0159\u00edda konstruktor pohybu a je um\u00edst\u011bna v kontejneru, STL optimalizuje kop\u00edrov\u00e1n\u00ed prvk\u016f uvnit\u0159 kontejneru (nap\u0159\u00edklad kdy\u017e se kontejner roz\u0161i\u0159uje a je pot\u0159eba zm\u011bnit kapacitu a realokovat pam\u011b\u0165). <\/p>\n<h3>L\u017e\u00edce dehtu<\/h3>\n<p>\nNejsp\u00ed\u0161 nejnep\u0159\u00edjemn\u011bj\u0161\u00ed (ale ne kritick\u00fd) d\u016fsledek migrace \u2014 narazili jsme na zv\u00fd\u0161en\u00ed objemu <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-soubor\u016f<\/a><\/noindex>, a celkov\u00fd v\u00fdsledek buildu se v\u0161emi mezifilmy za\u010dal zab\u00edrat 60 \u2013 70 GB. Toto chov\u00e1n\u00ed je spojeno se zvl\u00e1\u0161tnostmi modern\u00edch standardn\u00edch knihoven, kter\u00e9 se staly m\u00e9n\u011b kritick\u00e9 v\u016f\u010di objemu generovan\u00fdch pomocn\u00fdch soubor\u016f. To neovliv\u0148uje fungov\u00e1n\u00ed zkompilovan\u00e9 aplikace, ale p\u0159in\u00e1\u0161\u00ed \u0159adu nep\u0159\u00edjemnost\u00ed p\u0159i v\u00fdvoji, zejm\u00e9na zvy\u0161uje \u010das kompilace. Zvy\u0161uj\u00ed se tak\u00e9 po\u017eadavky na voln\u00e9 m\u00edsto na disc\u00edch buildov\u00fdch server\u016f a na stroj\u00edch v\u00fdvoj\u00e1\u0159\u016f. Na\u0161i v\u00fdvoj\u00e1\u0159i pracuj\u00ed paraleln\u011b na n\u011bkolika verz\u00edch platformy a stovky gigabajt\u016f mezifil\u016f n\u011bkdy zp\u016fsobuj\u00ed obt\u00ed\u017ee v pr\u00e1ci. Probl\u00e9m je nep\u0159\u00edjemn\u00fd, ale ne kritick\u00fd, jeho \u0159e\u0161en\u00ed jsme prozat\u00edm odlo\u017eili. Jako jeden z mo\u017en\u00fdch zp\u016fsob\u016f \u0159e\u0161en\u00ed zva\u017eujeme techniku <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Single_Compilation_Unit\">unity build<\/a><\/noindex> (zejm\u00e9na jej pou\u017e\u00edv\u00e1 Google p\u0159i v\u00fdvoji prohl\u00ed\u017ee\u010de Chrome).<br \/>\n<br \/>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Jak jsme p\u0159elo\u017eili 10 milion\u016f \u0159\u00e1dk\u016f k\u00f3du C++ na standard C++14 (a pot\u00e9 na C++17) | ProHoster","description":"N\u011bjakou dobu zp\u011bt (na podzim 2016) do\u0161lo b\u011bhem v\u00fdvoje dal\u0161\u00ed verze technologick\u00e9 platformy 1C:Enterprise k ot\u00e1zce podpory nov\u00e9ho standardu","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/32466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=32466"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/32466\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/24270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=32466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=32466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=32466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}