Hace algún tiempo (en el otoño de 2016), al desarrollar la próxima versión de la plataforma de tecnología 1C: Enterprise, surgió la pregunta dentro del equipo de desarrollo sobre el soporte del nuevo estándar
C ++ 14 en nuestro código. La transición a un nuevo estándar, como esperábamos, nos permitiría escribir muchas cosas de manera más elegante, simple y confiable, simplificando el soporte y mantenimiento del código. Y parece que no hay nada extraordinario en la traducción, si no fuera por la escala de la base del código y las características específicas de nuestro código.
Para aquellos que no saben, 1C: Enterprise es un entorno para el rápido desarrollo de aplicaciones empresariales multiplataforma y tiempo de ejecución para su ejecución en diferentes sistemas operativos y DBMS. En términos generales, el producto incluye:
- Application Server Cluster , se ejecuta en Windows y Linux
- El cliente que trabaja con el servidor a través de http (s) o que usa su propio protocolo binario funciona en Windows, Linux, macOS
- Cliente web que se ejecuta en Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari (escrito en JavaScript)
- Entorno de desarrollo ( Configurador ), se ejecuta en Windows, Linux, macOS
- Herramientas de administración del servidor de aplicaciones, ejecutadas en Windows, Linux, macOS
- Un cliente móvil que se conecta al servidor a través de http (s) funciona en dispositivos móviles con Android, iOS, Windows
- Plataforma móvil : un marco para crear aplicaciones móviles sin conexión con la capacidad de sincronizarse, ejecutarse en Android, iOS, Windows
- 1C: Herramientas de desarrollo empresarial , escritas en Java
- Servidor de interacción
Intentamos escribir tanto como sea posible un código para diferentes sistemas operativos: la base del código del servidor es del 99% en total, la base del cliente es aproximadamente del 95%. Plataforma tecnológica 1C: Enterprise está escrita principalmente en C ++ y las siguientes son características aproximadas del código:
- 10 millones de líneas de código C ++,
- 14 mil archivos
- 60 mil clases
- medio millón de métodos.
Y toda esta economía tuvo que ser transferida a C ++ 14. Hablaremos sobre cómo lo hicimos y lo que encontramos en el proceso.

Descargo de responsabilidad
Todo lo que se describe a continuación sobre la operación lenta / rápida, (no) gran consumo de memoria mediante implementaciones de clases estándar en varias bibliotecas significa una cosa: esto es cierto PARA NOSOTROS. Es posible que las implementaciones estándar sean las más adecuadas para sus tareas. Comenzamos con nuestras tareas: tomamos los datos típicos para nuestros clientes, ejecutamos escenarios típicos en ellos, observamos el rendimiento, la cantidad de memoria consumida, etc., y analizamos si estos resultados nos convienen a nosotros y a nuestros clientes o no. Y actuó sobre.
Lo que tuvimos
Inicialmente, escribimos el código para la plataforma 1C: Enterprise 8 en Microsoft Visual Studio. El proyecto comenzó a principios de la década de 2000 y teníamos una versión solo para Windows. Naturalmente, desde entonces el código se ha desarrollado activamente, muchos mecanismos se han reescrito por completo. Pero el código fue escrito de acuerdo con el estándar de 1998, y, por ejemplo, los corchetes angulares rectos se separaron por espacios para que la compilación se pueda pasar con éxito, así:
vector<vector<int> > IntV;
2006 , 8.1, Linux
STLPort. . std::wstring, wchar_t. Windows 2 , Linux 4 . , . gcc , wchar_t 2 , , .. glibc, 4- wchar_t. , - , . , last but not least, . , .. .
, 2000-
. , Facebook, Facebook , (.
folly).
:
- ( ).
- Copy On Write. , / .
, STLPort stream ( ), 20%.
Boost. Boost stream, , API (, ), , stream. , , Boost.
C++14 :
- STLPort C++14. , .. STLPort 2010 , .
- STL, C++14. , Windows Linux.
- .
- .
;
libc++, Windows. libc++ Windows, — , , , , libc++
POSIX API.
.
, STLPort (Visual Studio 2015 Windows, gcc 7 Linux, clang 8 macOS).
, , , , , , . 10 000 ( 14 000). wchar_t char16_t; wchar_t, .. char16_t 2 Windows Linux.
. , STLPort , . , .
, , . .
( 20-30%) ( 10-15%) . , , . , .
: ( ) std::map std::set . . , , – ( STLPort). Boost, , .
, , , , Windows-. , 2017 ( 8.3.11 1:) .
++14 6 . ( ) , , — UI, , ..
. , 1: 8.3.14 ( , )
++17.
. STL std, std , stdx – , , boost – boost. , .
«» (
move constructors) . , STL (, capacity ).
, , ( ) —
obj-, 60 – 70 . , . , , , . . , . , , .
unity build (, , Google Chrome).