{"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\/de\/blog\/administrirovanie\/kak-my-pereveli-10-millionov-strok-koda-c-na-standart-c-14-a-potom-i-na-c-17","title":{"rendered":"Wie wir 10 Millionen Zeilen C++-Code auf den Standard C++14 (und dann auf C++17) \u00fcbersetzt haben","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Vor einiger Zeit (im Herbst 2016) stellte sich im Entwicklungsteam bei der Entwicklung einer neuen Version der technologischen Plattform 1C:Enterprise die Frage nach der Unterst\u00fctzung des neuen Standards <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B14\">C++14<\/a><\/noindex> in unserem Code. Der Wechsel zu diesem neuen Standard w\u00fcrde es uns, wie wir annahmen, erm\u00f6glichen, viele Dinge eleganter, einfacher und zuverl\u00e4ssiger zu gestalten, und die Wartung und Pflege des Codes zu vereinfachen. Und auf den ersten Blick scheint die \u00dcbersetzung nicht au\u00dfergew\u00f6hnlich zu sein, wenn man jedoch die Gr\u00f6\u00dfe der Codebasis und die spezifischen Merkmale unseres Codes ber\u00fccksichtigt.<\/p>\n<p>F\u00fcr diejenigen, die es nicht wissen: 1C:Enterprise ist eine Umgebung f\u00fcr die schnelle Entwicklung plattform\u00fcbergreifender Gesch\u00e4ftsanwendungen und ein Runtime-System f\u00fcr deren Ausf\u00fchrung in verschiedenen Betriebssystemen und Datenbanksystemen. Im Gro\u00dfen und Ganzen umfasst das Produkt:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000885.htm\">Ein Cluster von Anwendungsservern<\/a><\/noindex>, arbeitet unter Windows und Linux<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000124.htm\">Kunde<\/a><\/noindex>, kommuniziert mit dem Server \u00fcber http(s) oder \u00fcber ein eigenes bin\u00e4res Protokoll, l\u00e4uft unter Windows, Linux, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/315414\/\">Web-Client<\/a><\/noindex>, l\u00e4uft in den Browsern Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari (geschrieben in JavaScript)<\/li>\n<li>Entwicklungsumgebung (<noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000008.htm\">Konfigurator<\/a><\/noindex>), l\u00e4uft unter Windows, Linux, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/Term_000000813.htm\">Administrationswerkzeuge<\/a><\/noindex> f\u00fcr Anwendungsserver, laufen unter Windows, Linux, macOS<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/wonderland.v8.1c.ru\/blog\/mobilnyy-klient\/\">Mobile Client<\/a><\/noindex>, der sich \u00fcber http(s) mit dem Server verbindet, funktioniert auf mobilen Ger\u00e4ten mit Android, iOS und Windows.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/283198\/\">Mobile Plattform<\/a><\/noindex> \u2014 ein Framework zur Erstellung von Offline-Mobilanwendungen mit Synchronisierungsfunktion, die auf Android, iOS und Windows laufen.<\/li>\n<li>Entwicklungsumgebung <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/IDE\/\">1C:Enterprise Development Tools<\/a><\/noindex>, geschrieben in Java<\/li>\n<li>Server <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/1c\/blog\/422903\/\">Interaktionssysteme<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nWir bem\u00fchen uns, m\u00f6glichst einen Code f\u00fcr verschiedene Betriebssysteme zu schreiben \u2014 die Codebasis des Servers ist zu 99 % gemeinsam, die des Clients etwa zu 95 %. Die technologische Plattform 1C:Enterprise ist \u00fcberwiegend in C++ geschrieben, und hier sind die ungef\u00e4hren Merkmale des Codes:<\/p>\n<ul>\n<li>10 Millionen Zeilen C++-Code,<\/li>\n<li>14.000 Dateien,<\/li>\n<li>60.000 Klassen,<\/li>\n<li>eine halbe Million Methoden.<\/li>\n<\/ul>\n<p>\nUnd all das musste auf C++14 portiert werden. Wie wir das gemacht haben und auf was wir dabei gesto\u00dfen sind, werden wir heute erz\u00e4hlen.<\/p>\n<p><img decoding=\"async\" alt=\"Wie wir 10 Millionen Zeilen C++-Code auf den Standard C++14 (und dann auf C++17) \u00fcbersetzt haben\" 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>Haftungsausschluss<\/h3>\n<p>\nAlles, was unten \u00fcber die langsame\/schnelle Leistung und den (nicht) hohen Speicherverbrauch von Standardklassen in verschiedenen Bibliotheken geschrieben steht, bedeutet Folgendes: Das gilt F\u00dcR UNS. M\u00f6glicherweise sind die Standardimplementierungen f\u00fcr Ihre Anforderungen die besten L\u00f6sungen. Wir haben uns jedoch an unseren Aufgaben orientiert: Wir haben typische Daten unserer Kunden genommen, typische Szenarien durchlaufen und die Leistung, den Speicherverbrauch usw. analysiert, um festzustellen, ob die Ergebnisse uns und unseren Kunden zufriedenstellen oder nicht. Und wir haben je nach Bedarf gehandelt.<\/p>\n<h3>Was wir hatten<\/h3>\n<p>\nUrspr\u00fcnglich haben wir den Code f\u00fcr die Plattform 1C:Enterprise 8 in Microsoft Visual Studio geschrieben. Das Projekt begann Anfang der 2000er Jahre und wir hatten nur eine Version f\u00fcr Windows. Nat\u00fcrlich hat sich seitdem der Code aktiv weiterentwickelt, viele Mechanismen wurden vollst\u00e4ndig neu geschrieben. Der Code wurde jedoch nach dem Standard von 1998 geschrieben, und beispielsweise waren die geschlossenen rechten Klammern durch Leerzeichen getrennt, damit die Kompilierung erfolgreich war, so:<\/p>\n<pre><code class=\"cpp\">vector&lt;vector &gt; IntV;<\/code><\/pre>\n<p>\nIm Jahr 2006, mit der Ver\u00f6ffentlichung der Version 8.1 der Plattform, begannen wir, Linux zu unterst\u00fctzen und wechselten zu einer externen Standardbibliothek <noindex><a rel=\"nofollow\" href=\"http:\/\/www.stlport.org\/\">STLPort<\/a><\/noindex>. Einer der Gr\u00fcnde f\u00fcr den Wechsel war die Arbeit mit breiten Zeichenfolgen. In unserem Code verwenden wir \u00fcberall std::wstring, das auf dem wchar_t-Typ basiert. Seine Gr\u00f6\u00dfe betr\u00e4gt in Windows 2 Byte und in Linux standardm\u00e4\u00dfig 4 Byte. Dies f\u00fchrte zu Inkompatibilit\u00e4ten unserer bin\u00e4ren Protokolle zwischen Client und Server sowie zu verschiedenen persistenten Daten. Mit gcc-Optionen kann man angeben, dass die Gr\u00f6\u00dfe von wchar_t w\u00e4hrend der Kompilierung ebenfalls 2 Byte betragen soll, aber dann kann man die Verwendung der Standardbibliothek des Compilers vergessen, da sie glibc verwendet, die wiederum f\u00fcr 4-Byte-wchar_t kompiliert ist. Weitere Gr\u00fcnde waren die qualitativ hochwertigere Implementierung der Standardklassen, die Unterst\u00fctzung von Hash-Tabellen und sogar die Emulation der Semantik von Bewegungen innerhalb von Containern, die wir aktiv verwendet haben. Und ein weiterer Grund, wie man sagt, last but not least, war die Leistungsf\u00e4higkeit der Strings. Wir hatten unsere eigene Klasse f\u00fcr Strings, da in unserer Software-Spezifikationen stringoperationen sehr weit verbreitet sind und f\u00fcr uns entscheidend sind. <\/p>\n<p>Unser String basiert auf den Ideen der Stringoptimierung, die bereits zu Beginn der 2000er Jahre ge\u00e4u\u00dfert wurden. <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>. Sp\u00e4ter, als Alexandrescu bei Facebook arbeitete, wurde auf seine Anregung hin eine \u00e4hnliche Zeile in der Facebook-Engine implementiert (siehe Bibliothek <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/folly\">folly<\/a><\/noindex>).<\/p>\n<p>. In unserer Zeile verwendeten wir zwei Hauptoptimierungstechnologien:<\/p>\n<ol>\n<li>F\u00fcr kurze Werte nutzen wir einen internen Puffer im Objekt selbst (der keine zus\u00e4tzliche Speicherallokation ben\u00f6tigt).<\/li>\n<li>F\u00fcr alle anderen kommt die Mechanik <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>. Der Wert der Zeichenkette wird an einem Ort gespeichert; bei Zuweisung\/\u00c4nderung kommt ein Referenzz\u00e4hler zum Einsatz.<\/li>\n<\/ol>\n<p>\nUm die Kompilierung der Plattform zu beschleunigen, haben wir die Stream-Implementierung aus unserer STLPort-Version ausgeschlossen (die wir nicht verwendet haben), was uns eine Kompilierungsbeschleunigung von etwa 20 % einbrachte. Anschlie\u00dfend mussten wir Boost <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Boost\">eingeschr\u00e4nkt verwenden.<\/a><\/noindex>Boost nutzt aktiv Streams, insbesondere in seinen Service-APIs (z. B. f\u00fcr Logging), weshalb wir es modifizieren mussten, um die Verwendung von Streams auszuschlie\u00dfen. Das erschwerte uns wiederum den \u00dcbergang zu neuen Boost-Versionen. <\/p>\n<h3>Der dritte Weg<\/h3>\n<p>\nBeim \u00dcbergang auf den C++14-Standard haben wir folgende Optionen in Betracht gezogen:<\/p>\n<ol>\n<li>Die Anpassung des von uns modifizierten STLPort an den C++14 Standard. Diese Option ist sehr komplex, da die Unterst\u00fctzung f\u00fcr STLPort 2010 eingestellt wurde und wir den gesamten Code selbst anpassen m\u00fcssten.<\/li>\n<li>Der Umstieg auf eine andere STL-Implementierung, die mit C++14 kompatibel ist. Es w\u00e4re \u00e4u\u00dferst w\u00fcnschenswert, wenn diese Implementierung unter Windows und Linux verf\u00fcgbar w\u00e4re.<\/li>\n<li>Bei der Kompilierung jede OS-spezifische Bibliothek des entsprechenden Compilers zu verwenden.<\/li>\n<\/ol>\n<p>\nDie erste Option wurde sofort verworfen wegen des zu hohen Arbeitsaufwands.<\/p>\n<p>Wir haben eine Weile \u00fcber die zweite Option nachgedacht; dabei zogen wir in Betracht, <noindex><a rel=\"nofollow\" href=\"https:\/\/libcxx.llvm.org\/\">libc++<\/a><\/noindex>, aber diese funktionierte zu dem Zeitpunkt nicht unter Windows. Um libc++ nach Windows zu portieren, h\u00e4tte man eine Menge Arbeit leisten m\u00fcssen \u2013 beispielsweise alles, was mit Threads, Thread-Synchronisation und Atomizit\u00e4t zu tun hat, selbst zu implementieren, da in libc++ in diesen Bereichen das <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/POSIX\">POSIX API<\/a><\/noindex>.<\/p>\n<p>verwendet wurde.<\/p>\n<h3>Und wir w\u00e4hlten den dritten Weg.<\/h3>\n<p>\n\u00dcbergang. Daher mussten wir die Verwendung von STLPort durch die Bibliotheken der entsprechenden Compiler ersetzen (Visual Studio 2015 f\u00fcr Windows, gcc 7 f\u00fcr Linux, clang 8 f\u00fcr macOS). <\/p>\n<p>Zum Gl\u00fcck wurde unser Code haupts\u00e4chlich nach Richtlinien entwickelt und es wurden keine ungew\u00f6hnlichen Tricks verwendet, sodass die Migration auf neue Bibliotheken vergleichsweise reibungslos verlief. Dies geschah mit Hilfe von Skripten, die in den Quelldateien die Namen von Typen, Klassen, Namespaces und Includes ersetzten. Die Migration betraf 10.000 Quelldateien (von 14.000). wchar_t wurde durch char16_t ersetzt; wir haben uns entschieden, auf wchar_t zu verzichten, da char16_t auf allen Betriebssystemen 2 Bytes belegt und die Kompatibilit\u00e4t des Codes zwischen Windows und Linux nicht beeintr\u00e4chtigt.<\/p>\n<p>Ohne kleine Abenteuer ging es nicht. Zum Beispiel konnte man in STLPort einen Iterator implizit in einen Zeiger auf ein Element casten, was an einigen Stellen unseres Codes verwendet wurde. In den neuen Bibliotheken war dies nicht mehr m\u00f6glich, und diese Stellen mussten manuell analysiert und umgeschrieben werden. <\/p>\n<p>Also, die Code-Migration ist abgeschlossen, der Code wird f\u00fcr alle Betriebsysteme kompiliert. Es ist Zeit f\u00fcr die Tests. <\/p>\n<p>Die Tests nach dem Wechsel zeigten einen R\u00fcckgang der Leistung (stellenweise bis zu 20-30%) und einen Anstieg des Speicherverbrauchs (bis zu 10-15%) im Vergleich zur alten Codeversion. Dies war unter anderem auf die suboptimale Handhabung der Standard-Strings zur\u00fcckzuf\u00fchren. Daher mussten wir erneut unsere eigene, leicht modifizierte String-Implementierung verwenden. <\/p>\n<p>Es stellte sich auch eine interessante Besonderheit bei der Implementierung von Containern in den eingebetteten Bibliotheken heraus: Leere (ohne Elemente) std::map und std::set aus den eingebetteten Bibliotheken allokieren Speicher. In unserem Code werden aufgrund spezifischer Implementierungsdetails an einigen Stellen ziemlich viele leere Container dieses Typs erstellt. Die Standardcontainer allokieren zwar nur wenig Speicher, f\u00fcr ein einzelnes Wurzel-Element, aber f\u00fcr uns war das kritisch \u2013 in mehreren Szenarien fiel die Leistung sp\u00fcrbar ab und der Speicherverbrauch stieg (im Vergleich zu STLPort). Deshalb haben wir in unserem Code diese beiden Containertypen aus den eingebetteten Bibliotheken durch deren Implementierung von Boost ersetzt, wo diese Container nicht die gleiche Problematik aufwiesen, und das hat das Problem mit der Verlangsamung sowie dem erh\u00f6hten Speicherverbrauch gel\u00f6st.<\/p>\n<p>Wie so oft nach umfangreichen \u00c4nderungen in gro\u00dfen Projekten, hatte die erste Iteration des Quellcodes einige Probleme, und hier kam uns besonders die Unterst\u00fctzung durch Debugging-Iteratoren in der Windows-Implementierung zugute. Schritt f\u00fcr Schritt arbeiteten wir uns voran, und bis zum Fr\u00fchjahr 2017 (Version 8.3.11 1C:Enterprise) war die Migration abgeschlossen. <\/p>\n<h3>Ergebnisse<\/h3>\n<p>\nDer Wechsel zu C++14 dauerte bei uns etwa 6 Monate. Die meiste Zeit arbeitete ein einzelner (aber sehr qualifizierter) Entwickler am Projekt, und in der finalen Phase schlossen sich Vertreter der Teams an, die f\u00fcr bestimmte Bereiche verantwortlich waren \u2014 UI, Cluster-Server, Entwicklungs- und Verwaltungstools usw.<\/p>\n<p>Der \u00dcbergang hat unsere Arbeit an der Migration zu den neuesten Versionen des Standards erheblich vereinfacht. So wurde die Version 1C:Enterprise 8.3.14 (in Entwicklung, die Ver\u00f6ffentlichung ist f\u00fcr Anfang n\u00e4chsten Jahres geplant) bereits auf den Standard umgestellt. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/C%2B%2B17\">C++17<\/a><\/noindex>. <\/p>\n<p>Nach der Migration haben die Entwickler mehr M\u00f6glichkeiten. W\u00e4hrend wir fr\u00fcher eine angepasste Version von STL und einen Namensraum std hatten, befinden sich jetzt die Standardklassen aus den eingebauten Bibliotheken des Compilers im Namensraum std, unsere f\u00fcr unsere Bed\u00fcrfnisse optimierten Strings und Container im Namensraum stdx und die neueste Version von Boost im Namensraum Boost. Der Entwickler kann die Klassen verwenden, die am besten f\u00fcr seine Aufgaben geeignet sind. <\/p>\n<p>Auch die \u201enative\u201c Implementierung der Move-Konstruktoren hilft bei der Entwicklung (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/move_constructor\">Move-Konstruktoren<\/a><\/noindex>) f\u00fcr eine Reihe von Klassen. Wenn eine Klasse einen Move-Konstruktor hat und diese Klasse in einen Container eingef\u00fcgt wird, optimiert STL die Kopieroperationen innerhalb des Containers (zum Beispiel, wenn der Container erweitert wird und die Kapazit\u00e4t ge\u00e4ndert sowie der Speicher neu zugewiesen werden muss). <\/p>\n<h3>Ein negativer Punkt<\/h3>\n<p>\nDas vielleicht unangenehmste (aber nicht kritische) Ergebnis der Migration ist, dass wir mit einer Zunahme von <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\">Objektdateien<\/a><\/noindex>, und das endg\u00fcltige Build-Ergebnis mit allen Zwischendateien ben\u00f6tigt 60 bis 70 GB. Dieses Verhalten h\u00e4ngt mit den Eigenschaften moderner Standardbibliotheken zusammen, die weniger kritisch zum Umfang der generierten Hilfsdateien stehen. Es beeinflusst nicht die Funktion der kompilierten Anwendung, bringt jedoch einige Unannehmlichkeiten in der Entwicklung mit sich, insbesondere verl\u00e4ngert es die Kompilierungszeit. Auch die Anforderungen an den verf\u00fcgbaren Speicherplatz auf den Build-Servern und den Maschinen der Entwickler steigen. Unsere Entwickler arbeiten parallel an mehreren Versionen der Plattform, und Hunderte von Gigabyte an Zwischendateien schaffen manchmal Schwierigkeiten bei der Arbeit. Das Problem ist unangenehm, aber nicht kritisch; wir haben die L\u00f6sung vorerst aufgeschoben. Eine der in Betracht gezogenen L\u00f6sungsans\u00e4tze ist die Technik <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Single_Compilation_Unit\">unity build<\/a><\/noindex> (diese wird unter anderem von Google bei der Entwicklung des Browsers Chrome verwendet).<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Wie wir 10 Millionen Zeilen C++-Code auf den C++14-Standard (und sp\u00e4ter auf C++17) portiert haben | ProHoster","description":"Vor einiger Zeit (im Herbst 2016) stellte das Entwicklungsteam w\u00e4hrend der Arbeit an der n\u00e4chsten Version der technologischen Plattform 1C:Enterprise die Frage, ob wir den neuen C++14-Standard in unserem Code unterst\u00fctzen sollten. Der \u00dcbergang zu diesem neuen Standard w\u00fcrde es uns erm\u00f6glichen, viele Dinge eleganter, einfacher und zuverl\u00e4ssiger zu gestalten, was die Wartung und Unterst\u00fctzung des Codes erleichtern w\u00fcrde. Dabei scheint der Inhalt im \u00dcbersetzung nichts Au\u00dfergew\u00f6hnliches zu beinhalten.","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/32466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=32466"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/32466\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/24270"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=32466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=32466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=32466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}