{"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\/sq\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17","title":{"rendered":"Si e p\u00ebrkthym\u00eb 10 milion linja kodi C++ n\u00eb standardin C++14 (dhe m\u00eb pas n\u00eb C++17)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Disa para nj\u00eb kohe (n\u00eb vjesht\u00ebn e 2016), gjat\u00eb zhvillimit t\u00eb nj\u00eb versioni t\u00eb ri t\u00eb platform\u00ebs teknologjike 1C:Enterprise, ekipi i zhvillimit u p\u00ebrball me \u00e7\u00ebshtjen e mb\u00ebshtetjes s\u00eb standardit t\u00eb ri <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B14\">C++14<\/a><\/noindex> n\u00eb kodin ton\u00eb. Kalimi n\u00eb standardin e ri, si\u00e7 parashikuam, do t\u00eb na lejonte t\u00eb shkruante shum\u00eb gj\u00ebra m\u00eb elegant, m\u00eb thjesht dhe m\u00eb t\u00eb besuesh\u00ebm, duke thjeshtuar mb\u00ebshtetje dhe mir\u00ebmbajtje t\u00eb kodit. Dhe n\u00eb p\u00ebrkthim nuk duket se ka ndonj\u00eb gj\u00eb t\u00eb jasht\u00ebzakonshme, n\u00ebse nuk merr parasysh shkall\u00ebt e baz\u00ebs s\u00eb kodit dhe karakteristikat specifike t\u00eb kodit ton\u00eb.<\/p>\n<p>P\u00ebr ata q\u00eb nuk e din\u00eb, 1C:Enterprise \u00ebsht\u00eb nj\u00eb mjedis p\u00ebr zhvillimin e shpejt\u00eb t\u00eb aplikacioneve biznesore nd\u00ebrplatform\u00eb dhe runtime p\u00ebr ekzekutimin e tyre n\u00eb sisteme t\u00eb ndryshme operative dhe DB. N\u00eb p\u00ebrmbledhje, produkti p\u00ebrfshin:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000885.htm\">Klastri i serverave t\u00eb aplikacioneve<\/a><\/noindex>, punon n\u00eb Windows dhe Linux<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000124.htm\">K\u03bb\u03af\u03bf\u03c5ent<\/a><\/noindex>, i cili komunikon me serverin p\u00ebrmes http(s) ose me protokollin e tij binar, punon n\u00eb Windows, Linux, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/315414\/\">Klienti web<\/a><\/noindex>, punon n\u00eb shfletuesit Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari (i shkruar n\u00eb JavaScript)<\/li>\n<li>Mjedisi i zhvillimit (<noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000008.htm\">Konfiguruesi<\/a><\/noindex>), punon n\u00eb Windows, Linux, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000813.htm\">Mjetet e administrat\u00ebs<\/a><\/noindex> t\u00eb serverave t\u00eb aplikacioneve, punojn\u00eb n\u00eb Windows, Linux, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/mobilnyy-klient\/\">Klienti mobil<\/a><\/noindex>, i cili lidhet me serverin p\u00ebrmes http(s), punon n\u00eb pajisje mobile q\u00eb p\u00ebrdorin Android, iOS, Windows<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/283198\/\">Platforma mobil<\/a><\/noindex> \u2014 nj\u00eb korniz\u00eb p\u00ebr krijimin e aplikacioneve mobile offline me mund\u00ebsi sinkronizimi, punon n\u00eb Android, iOS, Windows<\/li>\n<li>Mjedisi i zhvillimit <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/IDE\/\">1C:Enterprise Development Tools<\/a><\/noindex>, e shkruar n\u00eb Java<\/li>\n<li>Server <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/422903\/\">Sistemet e Nd\u00ebrveprimit<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nNe p\u00ebrpiqemi t\u00eb shkruajm\u00eb nj\u00eb kod t\u00eb vet\u00ebm p\u00ebr sisteme t\u00eb ndryshme operative \u2014 baza e kodit t\u00eb serverit \u00ebsht\u00eb e p\u00ebrbashk\u00ebt n\u00eb 99%, e klientit \u2014 rreth 95%. Platforma teknologjike 1C:Enterprise \u00ebsht\u00eb kryesisht e shkruar n\u00eb C++ dhe m\u00eb posht\u00eb jan\u00eb karakteristikat e p\u00ebraf\u00ebrta t\u00eb kodit:<\/p>\n<ul>\n<li>10 milion rreshta kodi C++,<\/li>\n<li>14 mij\u00eb skeda,<\/li>\n<li>60 mij\u00eb klasa,<\/li>\n<li>p\u00ebr gjysm\u00eb milioni metoda.<\/li>\n<\/ul>\n<p>\nDhe e gjith\u00eb kjo duhej t\u00eb kalonte n\u00eb C++14. Sot do t\u00eb tregojm\u00eb se si e b\u00ebm\u00eb k\u00ebt\u00eb dhe me \u00e7far\u00eb u p\u00ebrball\u00ebm gjat\u00eb procesit.<\/p>\n<p><img decoding=\"async\" alt=\"Si e p\u00ebrkthym\u00eb 10 milion linja kodi C++ n\u00eb standardin C++14 (dhe m\u00eb pas n\u00eb 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>K\u00ebrc\u00ebnimi<\/h3>\n<p>\nGjith\u00e7ka q\u00eb \u00ebsht\u00eb shkruar m\u00eb posht\u00eb p\u00ebr pun\u00ebn e ngadalshme \/ t\u00eb shpejt\u00eb, (s\u00eb)cila konsum t\u00eb vog\u00ebl t\u00eb memories me implementimet e klasave standarde n\u00eb biblioteka t\u00eb ndryshme do t\u00eb thot\u00eb nj\u00eb gj\u00eb: kjo \u00ebsht\u00eb e v\u00ebrtet\u00eb P\u00cbR NE. Mbase, p\u00ebr detyrat tuaja, implementimet standarde mund t\u00eb jen\u00eb m\u00eb t\u00eb p\u00ebrshtatshme. Ne gjithashtu ishim t\u00eb orientuar nga detyrat tona: mor\u00ebm tipare tipike t\u00eb klient\u00ebve tan\u00eb, i testuam ato me skenar\u00eb tipik\u00eb, shqyrtuam performanc\u00ebn, v\u00ebllimin e memorizimit q\u00eb p\u00ebrdorej, etj., dhe analizuam n\u00ebse rezultatet na plot\u00ebsonin ne dhe klient\u00ebt tan\u00eb apo jo. Dhe vepruam n\u00eb p\u00ebrputhje me k\u00ebt\u00eb.<\/p>\n<h3>\u00c7far\u00eb kishim<\/h3>\n<p>\nFillimisht e shkruam kodin e platform\u00ebs 1C:Enterprise 8 n\u00eb Microsoft Visual Studio. Projekti filloi n\u00eb fillim t\u00eb viteve 2000 dhe ne kishim vet\u00ebm versionin p\u00ebr Windows. Natyrisht, q\u00eb nga at\u00ebher\u00eb kodi e p\u00ebrjetoi nj\u00eb zhvillim aktiv, shum\u00eb mekanizma u shkruan nga e para. Por kodi u shkrua sipas standardeve t\u00eb vitit 1998, dhe, p\u00ebr shembull, k\u00ebndet e djathta ishin t\u00eb ndara me hap\u00ebsira p\u00ebr t\u00eb kaluar me sukses kompaktimin, k\u00ebshtu:<\/p>\n<pre><code class=\"cpp\">vector&lt;vector &gt; IntV;<\/code><\/pre>\n<p>\nN\u00eb vitin 2006, me lan\u00e7imin e versionit 8.1 t\u00eb platform\u00ebs, filluam t\u00eb mb\u00ebshtesim Linux dhe kaluam n\u00eb nj\u00eb bibliotek\u00eb standarde t\u00eb tret\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/www.stlport.org\/\">STLPort<\/a><\/noindex>. Nj\u00eb nga arsyet p\u00ebr kalim ishte puna me stringjet e gjer\u00eb. N\u00eb kodin ton\u00eb ne p\u00ebrdorim gjithandej std::wstring, i bazuar n\u00eb tipin wchar_t. Madh\u00ebsia e tij n\u00eb Windows \u00ebsht\u00eb 2 byte, nd\u00ebrsa n\u00eb Linux p\u00ebr default \u00ebsht\u00eb 4 byte. Kjo shkaktonte mosp\u00ebrputhje t\u00eb protokolleve tona binar\u00eb midis klientit dhe serverit, si dhe t\u00eb t\u00eb dh\u00ebnave t\u00eb ndryshme persistente. Me opsionet gcc mund t\u00eb specifikohet q\u00eb madh\u00ebsia e wchar_t gjat\u00eb kompaktimit t\u00eb jet\u00eb gjithashtu 2 byte, por at\u00ebher\u00eb mund t\u00eb harrohet p\u00ebr p\u00ebrdorimin e bibliotek\u00ebs standarde nga kompilator\u00ebt, sepse ajo p\u00ebrdor glibc, e cila gjithashtu \u00ebsht\u00eb kompaktuar p\u00ebr wchar_t 4-byte. Arsyet e tjera ishin implementimi m\u00eb cil\u00ebsor i klasave standarde, mb\u00ebshtetje p\u00ebr tabelat hash dhe madje edhe simulimi i semantik\u00ebs s\u00eb zhvendosjes brenda kontejner\u00ebve, nga e cila e p\u00ebrdorim aktivisht. Dhe nj\u00eb arsye tjet\u00ebr, si\u00e7 thon\u00eb, e fundit por jo m\u00eb pak e r\u00ebnd\u00ebsishme, ishte performanca e stringjeve. Ne kishim klas\u00ebn ton\u00eb p\u00ebr stringjet, sepse p\u00ebr shkak t\u00eb specifikave t\u00eb softuerit ton\u00eb operacionet me string jan\u00eb p\u00ebrdorur shum\u00eb gjer\u00ebsisht dhe p\u00ebr ne ajo \u00ebsht\u00eb kritike. <\/p>\n<p>Stringu yn\u00eb bazohet n\u00eb idet\u00eb p\u00ebr optimizimin e stringjeve, t\u00eb shprehura q\u00eb n\u00eb fillim t\u00eb viteve 2000 <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>. M\u00eb von\u00eb, kur Aleksandresku punonte n\u00eb Facebook, me nism\u00ebn e tij, nj\u00eb rresht q\u00eb punonte n\u00eb parime t\u00eb ngjashme u p\u00ebrdor n\u00eb motorin e Facebook (shihni bibliotek\u00ebn <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/folly\">folly<\/a><\/noindex>).<\/p>\n<p>. N\u00eb rreshtin ton\u00eb u p\u00ebrdor\u00ebn dy teknologjit\u00eb kryesore t\u00eb optimizimit:<\/p>\n<ol>\n<li>P\u00ebr vlera t\u00eb shkurtra, p\u00ebrdoret nj\u00eb buffer i brendsh\u00ebm n\u00eb vet\u00eb objektin e rreshtit (i cili nuk k\u00ebrkon alokim t\u00eb m\u00ebtejsh\u00ebm t\u00eb memorjes).<\/li>\n<li>P\u00ebr t\u00eb gjitha t\u00eb tjerat p\u00ebrdoret mekanika <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>. Vlera e rreshtit ruhet n\u00eb nj\u00eb vend, dhe kur ndodhin caktime\/modifikime, p\u00ebrdoret nj\u00eb num\u00ebr i referencave.<\/li>\n<\/ol>\n<p>\nP\u00ebr t\u00eb p\u00ebrshpejtuar kompaktimin e platform\u00ebs, ne p\u00ebrjashtuam nga varianti yn\u00eb i STLPort zbatimin e stream (t\u00eb cilin nuk e p\u00ebrdor\u00ebm), q\u00eb na dha nj\u00eb p\u00ebrshpejtim t\u00eb kompaktimit prej rreth 20%. M\u00eb pas na duhej t\u00eb p\u00ebrdornim n\u00eb m\u00ebnyr\u00eb t\u00eb kufizuar <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Boost\">Boost<\/a><\/noindex>. Boost p\u00ebrdor aktivisht stream, sidomos n\u00eb API-t\u00eb e tij t\u00eb sh\u00ebrbimit (p\u00ebr shembull, p\u00ebr logimin), k\u00ebshtu q\u00eb na duhej ta modifikonim at\u00eb, duke p\u00ebrjashtuar p\u00ebrdorimin e stream. Kjo, nga ana e saj, e v\u00ebshtir\u00ebsoi kalimin ton\u00eb n\u00eb versionet e reja t\u00eb Boost. <\/p>\n<h3>M\u00ebnyra e tret\u00eb<\/h3>\n<p>\nN\u00eb kalimin n\u00eb standardin C++14, ne shqyrtuam k\u00ebto opsione:<\/p>\n<ol>\n<li>T\u00eb ngrinim STLPort e modifikuar nga ne n\u00eb standardin C++14. Kjo \u00ebsht\u00eb nj\u00eb opsion shum\u00eb i komplikuar, sepse mb\u00ebshtetja p\u00ebr STLPort u nd\u00ebrpre n\u00eb 2010, dhe duhej t\u00eb ngrinim t\u00eb gjith\u00eb kodin e tij vet\u00eb.<\/li>\n<li>T\u00eb kalonim n\u00eb nj\u00eb implementim tjet\u00ebr t\u00eb STL, t\u00eb p\u00ebrputhsh\u00ebm me C++14. \u00cbsht\u00eb shum\u00eb e d\u00ebshirueshme q\u00eb kjo implementim t\u00eb ishte p\u00ebr Windows dhe Linux.<\/li>\n<li>T\u00eb p\u00ebrdorim bibliotek\u00ebn e integruar n\u00eb p\u00ebrkat\u00ebsin kompjuter p\u00ebr secil\u00ebn OS gjat\u00eb kompaktimit.<\/li>\n<\/ol>\n<p>\nOpsioni i par\u00eb u hodh posht\u00eb menj\u00ebher\u00eb p\u00ebr shkak t\u00eb volumit t\u00eb madh t\u00eb pun\u00ebs.<\/p>\n<p>Ne menduam p\u00ebr nj\u00eb koh\u00eb mbi opsionin e dyt\u00eb; si kandidat shqyrtuam <noindex><a rel=\"nofollow\" href=\"https:\/\/libcxx.llvm.org\/\">libc++<\/a><\/noindex>, por n\u00eb at\u00eb koh\u00eb nuk funksiononte n\u00ebn Windows. P\u00ebr t\u00eb portuar libc++ n\u00eb Windows, do t\u00eb duhej t\u00eb b\u00ebnim shum\u00eb pun\u00eb \u2014 p\u00ebr shembull, t\u00eb shkruanim vet\u00eb gjith\u00e7ka q\u00eb lidhet me rrjedhat, sinkronizimin e rrjedhave dhe atomik\u00ebn, pasi n\u00eb libc++ n\u00eb k\u00ebto fusha u p\u00ebrdor <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/POSIX\">POSIX API<\/a><\/noindex>.<\/p>\n<p>Dhe ne zgjodh\u00ebm m\u00ebnyr\u00ebn e tret\u00eb.<\/p>\n<h3>Kalimi<\/h3>\n<p>\nPra, na duhej t\u00eb z\u00ebvend\u00ebsonim p\u00ebrdorimin e STLPort me bibliotekat p\u00ebrkat\u00ebse t\u00eb kompiler\u00ebve (Visual Studio 2015 p\u00ebr Windows, gcc 7 p\u00ebr Linux, clang 8 p\u00ebr macOS). <\/p>\n<p>Fatkeq\u00ebsisht, kodi yn\u00eb u shkrua kryesisht sipas udh\u00ebzimeve dhe nuk p\u00ebrdori truqe t\u00eb nd\u00ebrlikuara, k\u00ebshtu q\u00eb migrimi n\u00eb bibliotekat e reja kaloi relativisht pa probleme, me ndihm\u00ebn e skripteve q\u00eb z\u00ebvend\u00ebsonin emrat e tipeve, klasave, hap\u00ebsirave t\u00eb emrave dhe p\u00ebrfshirjeve n\u00eb skedar\u00ebt burimor\u00eb. Migrimi ndau 10,000 skedar\u00eb burimor\u00eb (nga 14,000). wchar_t u z\u00ebvend\u00ebsua me char16_t; ne vendos\u00ebm t\u00eb heqim dor\u00eb nga p\u00ebrdorimi i wchar_t, sepse char16_t n\u00eb t\u00eb gjitha sistemet operative merr 2 byte dhe nuk d\u00ebmton kompatibilitetin e kodit mes Windows dhe Linux.<\/p>\n<p>Nuk munguan aventura t\u00eb vogla. P\u00ebr shembull, n\u00eb STLPort, itereatori mund t\u00eb kalohej n\u00eb m\u00ebnyr\u00eb t\u00eb paqart\u00eb n\u00eb nj\u00eb tregues ndaj elementit, dhe n\u00eb disa vende t\u00eb kodit ton\u00eb kjo ishte p\u00ebrdorur. N\u00eb bibliotekat e reja kjo nuk ishte m\u00eb e mundur, dhe k\u00ebto vende duhej t\u00eb analizohej dhe rishkruheshin manualisht. <\/p>\n<p>Pra, migrimi i kodit p\u00ebrfundoi, kodi kompilohet p\u00ebr t\u00eb gjitha sistemet operative. Ka ardhur koha p\u00ebr testime. <\/p>\n<p>Testet pas kalimit treguan nj\u00eb r\u00ebnie t\u00eb performanc\u00ebs (n\u00eb disa raste deri n\u00eb 20-30%) dhe nj\u00eb rritje t\u00eb konsumit t\u00eb memories (deri n\u00eb 10-15%) krahasuar me versionin e vjet\u00ebr t\u00eb kodit. Kjo u lidhi, mes t\u00eb tjerash, me pun\u00ebn jo optimale t\u00eb vargjeve standarde. Prandaj, ata na duhej p\u00ebrs\u00ebri t\u00eb p\u00ebrdornim vargun ton\u00eb, t\u00eb modifikuar pak. <\/p>\n<p>Gjithashtu, doli nj\u00eb ve\u00e7ori interesante e implementimit t\u00eb en\u00ebve n\u00eb bibliotekat e integruara: std::map dhe std::set t\u00eb zbraz\u00ebta (pa elemente) nga bibliotekat e integruara alokojn\u00eb memorje. N\u00eb kodin ton\u00eb, p\u00ebr shkak t\u00eb ve\u00e7orive t\u00eb implementimit, krijohen shum\u00eb en\u00eb t\u00eb zbraz\u00ebta t\u00eb k\u00ebtij lloji n\u00eb disa vende t\u00eb kodit. En\u00ebt standarde alokojn\u00eb disi memorje, p\u00ebr nj\u00eb element themelor, por p\u00ebr ne kjo u krijua kritikisht - n\u00eb disa skenar\u00eb, performanca jon\u00eb u ul ndjesh\u00ebm dhe rritja e konsumit t\u00eb memories (krahasuar me STLPort). Prandaj, ne z\u00ebvend\u00ebsuam k\u00ebto dy lloje en\u00ebsh nga bibliotekat e integruara me implementimin e tyre nga Boost, ku k\u00ebto en\u00eb nuk kishin nj\u00eb ve\u00e7ori t\u00eb till\u00eb, dhe kjo zgjidhi problemin me ngadal\u00ebsimin dhe rritjen e konsumit t\u00eb memories.<\/p>\n<p>Si\u00e7 ndodh shpesh pas ndryshimeve t\u00eb m\u00ebdha n\u00eb projekte t\u00eb m\u00ebdha, iteracioni i par\u00eb i burimeve punoi jo pa probleme, dhe k\u00ebtu na ndihmoi shum\u00eb, sidomos mb\u00ebshtetja e itereator\u00ebve p\u00ebr debugging n\u00eb implementimin p\u00ebr Windows. Hapa-hapa ne shkuam p\u00ebrpara, dhe deri n\u00eb pranver\u00ebn e vitit 2017 (versioni 8.3.11 i 1C:Enterprise) migrimi u p\u00ebrfundua. <\/p>\n<h3>P\u00ebrfundime<\/h3>\n<p>\nKalimi n\u00eb standardin C++14 mori rreth 6 muaj. Nj\u00eb zhvillues (por shum\u00eb i kualifikuar) punoi p\u00ebr pjes\u00ebn m\u00eb t\u00eb madhe t\u00eb projektit, nd\u00ebrsa n\u00eb faz\u00ebn finale u bashkuan p\u00ebrfaq\u00ebsuesit e grupeve p\u00ebrgjegj\u00ebse p\u00ebr fusha specifike - UI, klaster\u00ebt e server\u00ebve, mjetet e zhvillimit dhe administrat\u00ebs etj.<\/p>\n<p>Kalimi na e thjeshtoi shum\u00eb pun\u00ebn e migrimit n\u00eb versionet m\u00eb t\u00eb reja t\u00eb standardit. K\u00ebshtu, versioni 1C:Enterprise 8.3.14 (n\u00eb zhvillim, lan\u00e7imi \u00ebsht\u00eb planifikuar p\u00ebr fillimin e vitit t\u00eb ardhsh\u00ebm) \u00ebsht\u00eb tashm\u00eb i p\u00ebrkthyer n\u00eb standardin <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B17\">C++17<\/a><\/noindex>. <\/p>\n<p>Pas migrimit, zhvilluesit mor\u00ebn m\u00eb shum\u00eb mund\u00ebsi. N\u00ebse m\u00eb par\u00eb kishim versionin ton\u00eb t\u00eb modifikuar t\u00eb STL dhe nj\u00eb hap\u00ebsir\u00eb em\u00ebrtimi std, tani n\u00eb hap\u00ebsir\u00ebn em\u00ebrtuese std ndodhen klasat standarde nga bibliotekat e integruara t\u00eb kompilatorit, n\u00eb hap\u00ebsir\u00ebn em\u00ebrtuese stdx - klasat tona, optimizuar p\u00ebr detyrat tona, dhe n\u00eb boost - versioni i ri i boost. Zhvilluesi p\u00ebrdor ato klasa q\u00eb p\u00ebrshtaten m\u00eb mir\u00eb p\u00ebr zgjidhjen e detyrave t\u00eb tij. <\/p>\n<p>K\u00ebshtu ndihmon n\u00eb zhvillim edhe implementimi \"i natyrsh\u00ebm\" i konstruktor\u00ebve t\u00eb l\u00ebvizjes (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/move_constructor\">move constructors<\/a><\/noindex>) p\u00ebr disa klasa. N\u00ebse nj\u00eb klas\u00eb ka nj\u00eb konstruktor l\u00ebvizjeje dhe kjo klas\u00eb vendoset n\u00eb nj\u00eb konteiner, at\u00ebher\u00eb STL e optimizon kopjimin e elementeve brenda konteinerit (p\u00ebr shembull, kur konteneri zgjerohet dhe duhet t\u00eb ndryshohet kapaciteti dhe t\u00eb rialokohet memoria). <\/p>\n<h3>Nj\u00eb lug\u00eb katran<\/h3>\n<p>\nM\u00eb e pak\u00ebndshmja (por jo kritike) pasoj\u00eb e migrimit - ne u p\u00ebrball\u00ebm me rritjen e volumit t\u00eb <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-file<\/a><\/noindex>, dhe rezultati i plot\u00eb i nd\u00ebrtimit me t\u00eb gjitha skedar\u00ebt nd\u00ebrmjet\u00ebs zuri 60 \u2013 70 GB. Ky sjellje lidhet me karakteristikat e bibliotikave moderne standarde, t\u00eb cilat jan\u00eb b\u00ebr\u00eb m\u00eb pak kritike ndaj volumit t\u00eb skedar\u00ebve sh\u00ebrbim q\u00eb gjenerohen. Kjo nuk ndikon n\u00eb funksionimin e aplikacioneve t\u00eb komiluara, por krijon disa shqet\u00ebsime n\u00eb zhvillim, duke rritur koh\u00ebn e kompilimit. Rriten gjithashtu k\u00ebrkesat p\u00ebr hap\u00ebsir\u00eb t\u00eb lir\u00eb n\u00eb disqe n\u00eb server\u00ebt e nd\u00ebrtimit dhe n\u00eb makinat e zhvilluesve. Zhvilluesit tan\u00eb punojn\u00eb paralelisht n\u00eb disa versione t\u00eb platform\u00ebs, dhe qindra gigabajt t\u00eb skedar\u00ebve nd\u00ebrmjet\u00ebs ndonj\u00ebher\u00eb krijojn\u00eb v\u00ebshtir\u00ebsi n\u00eb pun\u00eb. Problemi \u00ebsht\u00eb i pak\u00ebndsh\u00ebm, por jo kritik; p\u00ebr zgjidhjen e tij, p\u00ebr momentin e kemi shtyr\u00eb. Si nj\u00eb nga opsionet p\u00ebr zgjidhjen e tij, po shqyrtojm\u00eb teknik\u00ebn <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Single_Compilation_Unit\">unity build<\/a><\/noindex> (e.g., it is used by Google in the development of the Chrome browser).<br \/>\n<br \/>Burimi: <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.2 - 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\/sq\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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\udd47Si si p\u00ebrkthyen 10 milion\u00eb rreshta kodi C++ n\u00eb standardin C++14 (dhe pastaj n\u00eb C++17) | ProHoster","description":"Disa para nj\u00eb kohe (n\u00eb vjesht\u00ebn e 2016), gjat\u00eb zhvillimit t\u00eb nj\u00eb versioni t\u00eb ri t\u00eb platform\u00ebs teknologjike 1C:Enterprise, ekipi i zhvillimit u p\u00ebrball me \u00e7\u00ebshtjen e mb\u00ebshtetjes s\u00eb standardit t\u00eb ri","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/32466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=32466"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32466\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/24270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=32466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=32466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=32466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}