Entendo que os modelos de expressão como técnica foram descobertos significativamente antes do padrão C ++ original em 1998. Por que eles não foram usados para melhorar o desempenho de várias classes padrão, como std::string
fluxos?
17
operator+
, poderá obterO(n)
e zero alocações redundantes para alocações repetidas, algo que ainda é mais rápido que as referências rvalue. Além disso, você pode otimizar, por exemplo, implementações de COW, copiando na gravação , não apenas "no índice para não-const". Também existem outros aplicativos em que o desempenho e a semântica podem ser aprimorados com modelos de expressão.Respostas:
Os modelos de expressão foram publicados pela primeira vez por Todd Veldhuizen em junho de 1995 , em um artigo na revista C ++ Report . Naquela época, o comitê padrão já estava fortemente envolvido na adição do STL ao padrão C ++, uma tarefa que, por si só, atrasou o padrão em um ou dois anos. (O STL foi apresentado ao comitê em 1993 e proposto oficialmente em 1994. Levou mais quatro anos para concluir o padrão.)
Dado que o comitê de padronização do C ++ é um grupo de voluntários, alguns deles nem mesmo são apoiados por empresas que pagam seus salários. despesas, acho que ninguém tinha recursos para adicionar outra idéia ao padrão C ++.
Além disso, 1995 é apenas o ano em que o artigo de Veldhuizen foi publicado. Para a técnica se tornar conhecida e reconhecida , levaria mais alguns anos . (A idéia do STL remonta aos anos 70, uma implementação Ada foi feita no final dos anos 80, o trabalho em uma implementação C ++ deve ter começado por volta de 1990 e levou mais três anos para que a idéia encontrasse o caminho para a padronização C ++ comitê.)
Havia, no entanto, apenas três anos desde o artigo de Todd até a votação final do padrão. Foi muito pouco tempo para incorporar uma idéia ainda nova e basicamente não testada.
Acrescente a isso o fato de que os Modelos de Expressão , sendo uma espécie de meta-programação de modelos, enfatizam os compiladores muito mais do que a STL comparativamente "simples". E pelo que me lembro, mesmo em 1998, quando o padrão foi publicado, não tínhamos um compilador que pudesse compilar todo o STL.
Dado que um dos principais objetivos do comitê de padronização era padronizar a prática estabelecida (não que eles se apeguassem a isso rigorosamente), os Modelos de Expressão nunca deveriam estar na agenda naquela época.
fonte
std::string
e iostreams não estavam no STL.std::string
foi alterado para transformá-lo em um recipiente STL, BTW.)A resposta simples é: você obviamente não fez lobby por isso. Nem eu porque tinha (e tenho) minha própria agenda, que não inclui modelos de expressão. Além disso, a interface em particular para strings já está tentando servir a muitos mestres, resultando em uma classe que é usada para tudo e boa para o mothing.
A biblioteca padrão já possui uma
std::valarray
família que se destina a suportar um estilo de implementação de modelo de expressão. Até onde eu sei, não é suficiente. Um problema que causou isso é que as pessoas que fizeram lobby para incluir sua versão incompleta no padrão deixaram de trabalhar nele no momento em que foi incluído. Houve tentativas de resgatá-lo (por exemplo, David Vandevoorde, Matt Austern, e eu trabalhei nele por um dia ou mais na reunião de Estocolmo), mas no final ninguém ficou interessado o suficiente.fonte
:)
A técnica agora conhecida como "modelos de expressão" foi descoberta (independentemente) pelo menos em 1994 por Todd Veldhuizen e por mim (o artigo de Todd é de 1995, mas leva algum tempo para que as coisas sejam publicadas; meu próprio trabalho foi mostrado pela primeira vez em comp.lang.c ++).
Na verdade, comecei a participar das reuniões do comitê C ++ exatamente por causa desse problema. Eu apresentei a técnica e um redesenho completo do std :: valarray ao comitê na primeira reunião de Santa Cruz em março de 1996. Foi considerada uma mudança muito grande, mas como Dietmar faz alusão, recebemos algumas palavras na reunião subsequente em Estocolmo, que permitem o uso de modelos de expressão para a implementação de std :: valarrray. Para minha surpresa, essas palavras ainda estão lá: Veja o parágrafo 3-6 da subseção [valarray.syn] 29.7.1 em http://wg21.link/N4727 .
fonte
Meu melhor palpite é que nenhum compilador seria capaz de compilar modelos de expressão em 1998.
fonte
:->
Além disso, eles não conseguiram melhorá-lo com rapidez suficiente, tornando-se cada vez mais difícil usar as técnicas de modelos que melhoram rapidamente. Quando o VC7.1 foi lançado e foi muito mais compatível, isso matou o Borland.