Por que o padrão C ++ não adotou modelos de expressão?

17

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::stringfluxos?

DeadMG
fonte
@ Chrishrively: Se eu enviasse uma proposta sugerindo essa mudança, seria absolutamente um problema que eu não soubesse por que não foi feito da primeira vez, e é absolutamente relevante para a programação e a resposta é muito específico.
DeadMG
O que exatamente você faria com os modelos de expressão para acelerar as strings?
jalf
5
@ jalf: Se você aplicá-lo operator+, poderá obter O(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.
DeadMG
Sei que essa pergunta foi feita há um tempo, mas elabore um pouco sobre o que são modelos de expressão e / ou link para material relevante.
einpoklum

Respostas:

17

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.

sbi
fonte
1
Mas std::stringe iostreams não estavam no STL.
R. Martinho Fernandes
@ R.MartinhoFernandes: Isso não significa, no entanto, que o comitê tenha recursos de sobra. (E std::string foi alterado para transformá-lo em um recipiente STL, BTW.)
SBI
2
Eu acho que só tenho que vincular isso: std :: string faz parte do STL?
Xeo 25/01/12
@sbi ah, isso faz sentido.
R. Martinho Fernandes
10

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::valarrayfamí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.

Dietmar Kühl
fonte
8
Você começa um pouco injusto, porque DeadMG não podia fazer lobby por causa disso, porque ele mal havia superado suas fraldas naquela época e provavelmente não havia chegado ao ponto em que poderia pronunciar "C ++" corretamente. :)
SBI
7
Lamento muitíssimo que, quando criança, não consegui fazer lobby: P
DeadMG
1
Sei que nem todos tiveram a oportunidade de influenciar o padrão. Embora eu assista regularmente às reuniões do comitê há cerca de 15 anos, minha influência no padrão é limitada. No entanto, meu argumento é: se alguém quer algo no padrão, precisa fazer um esforço! As coisas que não estão lá são basicamente as pessoas que têm outras prioridades, sejam elas técnicas ou não (por exemplo, concentrando-se totalmente em crescer).
Dietmar Kühl
A implementação libgcc do valarray baseia-se em modelos de expressão.
Phresnel # 25/14
3

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 .

Daveed V.
fonte
1
maravilha que é o ponto de usar ligação encurtador de URL em vez do verdadeiro
mosquito
3
@gnat: Se você souber um número de documento, é trivial escrever a URL wg21.link para ele. Foi o que eu fiz aqui. Isso me poupa a procurar a correspondência / ano em que um documento foi lançado. Além disso, espero que se / quando o WG21 decidir mover as URLs de hospedagem, o wg21.link seja atualizado de acordo, evitando referências antigas. (Ou seja, o ponto de não se encurtando, mas a legibilidade.)
Daveed V.
0

Meu melhor palpite é que nenhum compilador seria capaz de compilar modelos de expressão em 1998.

fredoverflow
fonte
1
Todd Veldhuizen fez seu trabalho de modelo de expressão antes de 1996 usando o compilador C ++ da KAI. O motivo é muito mais profano ...
1
Uma grande porcentagem da comunidade C ++ não foi capaz de usar o STL em todo o seu potencial até 2003 (estou olhando para você, Microsoft!), E isso não impediu o comitê de incorporar o STL no padrão.
SBI
2
Na verdade, bth Todd e eu originalmente conseguimos a técnica de modelos de expressão para trabalhar no compilador Borland C ++ 4 (lançado em 1993). Aliás, acredito que esse também seja o primeiro compilador no qual o STL foi feito para funcionar totalmente. Posteriormente, eu enviei uma biblioteca de modelos de expressão para vários outros compiladores (incluindo o compilador Sun da Cfront na época!). O compilador KAI C ++ um pouco mais tarde.
quer
@DaveedV. O BCC4 era um compilador muito bom para a época e muito melhor que a versão VC da época! No entanto, ele tinha algumas peculiaridades, como o infame "smiley bug". :->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.
Sbi