Há algum tempo (no outono de 2016), ao desenvolver a próxima versão da plataforma de tecnologia 1C: Enterprise, surgiu a pergunta dentro da equipe de desenvolvimento sobre o suporte ao novo padrão
C ++ 14 em nosso código. A transição para um novo padrão, como esperávamos, permitiria escrever muitas coisas de maneira mais elegante, simples e confiável, simplificando o suporte e a manutenção do código. E parece não haver nada de extraordinário na tradução, se não for a escala da base de código e os recursos específicos do nosso código.
Para quem não sabe, 1C: Enterprise é um ambiente para o rápido desenvolvimento de aplicativos de negócios de plataforma cruzada e tempo de execução para execução em diferentes sistemas operacionais e DBMS. Em termos gerais, o produto inclui:
- Application Server Cluster , executado no Windows e Linux
- O cliente que trabalha com o servidor via http (s) ou usa seu próprio protocolo binário trabalha no Windows, Linux, macOS
- Cliente da Web em execução no Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari (escrito em JavaScript)
- Development Environment ( Configurator ), roda em Windows, Linux, macOS
- Ferramentas de administração do servidor de aplicativos, executadas no Windows, Linux, macOS
- Um cliente móvel que se conecta ao servidor via http (s) funciona em dispositivos móveis com Android, iOS, Windows
- Plataforma móvel - uma estrutura para criar aplicativos móveis offline com a capacidade de sincronizar, executando no Android, iOS, Windows
- 1C: Ferramentas de Desenvolvimento Empresarial , escritas em Java
- Servidor de interação
Tentamos escrever o máximo possível de um código para diferentes sistemas operacionais - a base de códigos do servidor é de 99% no total, a base de clientes é de aproximadamente 95%. Plataforma tecnológica 1C: A empresa é escrita principalmente em C ++ e as seguintes são características aproximadas do código:
- 10 milhões de linhas de código C ++,
- 14 mil arquivos
- 60 mil aulas
- meio milhão de métodos.
E toda essa economia teve que ser transferida para o C ++ 14. Falaremos sobre como fizemos isso e o que encontramos no processo.

Isenção de responsabilidade
Tudo o que está escrito abaixo sobre operação lenta / rápida, (não) grande consumo de memória por implementações de classes padrão em várias bibliotecas significa uma coisa: isso é verdade PARA NÓS. É possível que as implementações padrão sejam mais adequadas para suas tarefas. Começamos com nossas tarefas: pegamos os dados típicos de nossos clientes, executamos cenários típicos, analisamos o desempenho, a quantidade de memória consumida etc. e analisamos se nossos resultados se adequam a nós e a nossos clientes. E agiu de acordo.
O que tínhamos
Inicialmente, escrevemos o código para a plataforma 1C: Enterprise 8 no Microsoft Visual Studio. O projeto começou no início dos anos 2000 e tínhamos uma versão apenas para Windows. Naturalmente, desde então, o código foi desenvolvido ativamente, muitos mecanismos foram completamente reescritos. Mas o código foi escrito de acordo com o padrão de 1998 e, por exemplo, os colchetes de ângulo reto foram separados por espaços para que a compilação passasse com êxito, assim:
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).