O C ++ 11 introduz a semântica de movimentação que pode, por exemplo, melhorar o desempenho do código em situações em que o C ++ 03 precisaria executar uma construção de cópia ou atribuição de cópia. Este artigo relata que o código a seguir experimenta uma velocidade de 5x quando compilado com C + 11:
vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
vector<int> x(1000);
V.push_back(x);
}
Qual é o impacto da semântica de movimentação do C ++ 11 no contexto da computação científica?
Estou interessado nesta questão é geral, mas, mais especificamente, também estou interessado em semântica de movimento para códigos de elementos finitos escritos usando bibliotecas de impulso. Testei alguns dos meus próprios códigos C ++ 03 usando a versão 1.47.0 do boost (desde que as notas de versão do boost mencionam a semântica de movimentos são introduzidas na 1.48.0) e a versão 1.53.0 do boost, mas não notei muitas melhorias. Eu acho que as economias de não ter que fazer cópia-construção para boost::numeric::ublas::vector
/ matrix
e boost::function
não são perceptíveis, pois a solução de matrizes do sistema constitui a maior parte da carga de trabalho.
Editar: Na verdade, parece que a semântica de movimentação só é implementada boost::function
(consulte as notas de lançamento da versão 1.52.0 ). Não há menção de semântica de movimento boost::numeric
, eu procurei as fontes para ter certeza e parece não haver referências de valor.
fonte
Respostas:
Penso que, na prática, o impacto é limitado e será limitado.
A razão pela qual está limitado agora é que os grandes pacotes de elementos finitos têm o cuidado de escrever um código portátil e, portanto, eles ainda não usam construções de linguagem C ++ 11 em seus próprios códigos.
Obviamente, eles se beneficiarão de códigos como o que você mostra onde, mesmo sem precisar alterar o código-fonte, você se beneficia de uma biblioteca aprimorada de suporte ao compilador, como o libstdc ++ for GCC. Dito isto, as pessoas na computação científica estão bem cientes das despesas de cópia e, portanto, para objetos onde importa, elas simplesmente não copiam - elas geram no local, ou fazem cópias rasas ou usam compartilhada ponteiros ou muitas das outras técnicas disponíveis para evitar a sobrecarga da cópia. Em outras palavras, a situação para a qual a semântica de movimentos foi inventada na verdade não ocorre com muita frequência em códigos científicos "reais".
fonte