O que você deve saber sobre C ++ 11 - Parte III


Veja: Parte 1 e Parte 2 Series

Esta será a terceira e última parte desta breve introdução ao C ++ 11 recursos. Até agora, temos tido um olhar para as diferentes características da linguagem interessante. Agora podemos ver o que está acontecendo com o Biblioteca Padrão (STD). Como você vai ver não só a língua melhora, mas o Departamento de DST, bem!

Desta vez:




  • suporte para threads
  • gerenciamento de memória com ponteiros inteligentes

Além disso, vamos tentar prever o futuro da língua e vou descrever o que perdemos durante esta viagem.

Amostras

O código-fonte pode ser encontrado no meu Github: fenbf/cpp11samples

Criamos um fio!

Comece 20 threads paralelas ...

NUM_THREADS int const = 20; myThreads rosca [NUM_THREADS]; for (int i = 0; i O que é surpreendente o código do exemplo acima?

O fato é que tudo isso aconteceu sem qualquer terceira especial biblioteca partido. Todas as classes de arame e utilitários estão em std ::. No antigo padrão não havia essa opção.

Primeiro, criamos uma série de std :: tópico, então nós criamos os fios no loop for (linhas 5-12). O interessante é que eu estou em meus tópicos e usar expressões lambda para o código de "vocação".

Depois que todos os fios são iniciados temos que esperar por eles. Isso é feito através de join () método. Basicamente, o segmento principal vai esperar por todas as threads de concluir o seu trabalho.

À direita é um depurador tela.

  1. A primeira seta indica o código em tempo de execução
  2. O segundo e terceiro setas mostram todas as discussões ativas (em depuração - malhas janela). Você pode ver que há uma linha comum e segmento de trabalho (que corre o std :: cout)

Mais: futuros e assíncrona

Podemos fazer ainda melhor! C ++ 11 tem todos os objetos para filetagem de fios como (é claro), os bloqueios de mutex, variáveis ​​de condição, também Atomics. Mas há também um nível API maior que pode fazer o seguinte:

Perform_long_computation Duplo () { // Um ​​algoritmo sofisticado ... retornar 10; } futureTest cancelar () { result = std :: assíncrona carro ([] () { retorno perform_long_computation (); }); Duplo finalResult result.get = (); }

Este é um "exemplo mais complexo bit (embora pareça muito simples). Como mencionado antes, Biblioteca Padrão introduziu um API de alto nível que dá as características para chamar funções assíncrono. Basicamente, você usa std :: async para chamar a função (no nosso exemplo, usamos lambda + operação normal). Então você começa um manipulador de objeto (a variável "resultado") que contém o estado interno de execução assíncrona. Quando você chamar .get () toda a magia acontece sob DST e garante que o resultado estará disponível.

Um outro olhar:

  • resultado é um objecto espacial, que contém o denominado estado compartilhado.
  • .get () função garante o resultado é calculado - você pode começar a discussão e esperar até que ela termine.

Você pode ler mais sobre o futuro no meu blog post ou CPP-11-async-tutorial /

O gerenciamento de memória com ponteiros

O que está errado com este código?

badPointers empty () { * Carro Car = new Car ("meu"); some_condition bool = true; if (some_condition) voltar; eliminar carro; }

Nós criamos um carro objeto na pilha (free shop) e, eventualmente, chamado destrua; Mas o que acontecerá quando some_condition variável-lo? Vamos ter um vazamento de memória!

Este código é muito simples, mas, por favor imaginar uma centena de linhas deste código. Não é fácil se lembrar de limpar a memória na posição correta. Talvez existam alguns métodos que poderiam nos ajudar?

betterPointers empty () { std :: carro unique_ptr (novo carro ("meu")); some_condition bool = true; if (some_condition) voltar; }

Ponteiros

Tipo Pointer Descrição unique_ptr não pode ser copiado, Mobile shared_ptr podem ser compartilhados e copiado, contador de referência no interior weak_ptr de uso comum, para quebrar os ciclos, pode ser convertido em shared_ptr Ponteiro Raw somente para observar

Como você pode ver, usamos uma coisa chamada unique_ptr a partir da biblioteca padrão. Agora podemos remover todas as expressões de eliminação. Em geral, unique_ptr é uma implementação de um ponteiro idéia inteligente.

Em suma: um ponteiro inteligente tem propriedade um ponteiro e é responsável por destruí-la. No nosso exemplo, quando o carro sai do escopo seu ponteiro serão excluídos. Note que pode deixar o campo em dois pontos: quando a função "naturalmente" termina ou quando some_condition é verdade (então também sair do âmbito de aplicação). Em ambos estes estados unique_ptr vai lidar com limpador de memória.

Em C ++ moderno você não deve usar ponteiros crus de tudo. Na maioria dos casos, ponteiros inteligentes será melhor e que salvar um monte de problemas. Ponteiros crus são ok, mas apenas para a observação de objetos.

Veja a tabela à direita para mais referência sobre ponteiros inteligentes.

O futuro é brilhante

C ++ 11, como o nome sugere, foi padronizado em 2011. Mas, felizmente, não precisamos de esperar mais 10 ou mais anos para mais um grande passo! Este ano - em 2014 - um outro padrão testamento (ou realmente é) aceita: C ++ 14 que é uma pequena atualização do C ++ 11.

C ++ 14 acrescenta algumas melhorias para a língua como lambda melhor melhor dedução, para os tipos de retorno de uma função, touples melhoradas ... Todas as alterações podem ser encontrados aqui na página wiki.

A coisa mais importante é saber que comitê de normalização está a desenvolver um novo padrão C ++ 17, que trará ainda mais novidades. A língua está em grande forma, mas infelizmente não há um monte de coisas para fazer com a biblioteca padrão. Por exemplo, quando confrontado com o .NET Framework ou Java SDK, há uma grande diferença contra o C ++. É claro que existem grandes bibliotecas para C ++ (como reforço), mas ainda assim seria bom ter poderosa biblioteca padrão instalado com o compilador.

C ++ 17 vai trazer um monte de novas bibliotecas: sistema de arquivos, redes, melhor concorrência, talvez até mesmo desenho em 2D!

Que recursos foram ignorados

A lista completa de mudanças linguísticas e a biblioteca tem cerca de 45 itens. A grande quantidade de recursos não foram mencionados na série. Abaixo, você pode encontrar uma lista de tópicos que precisam ser revistos e cavar bem.

  • referências rvalue e mover semântica
  • containers desordenadas
  • Suporte a expressões regulares
  • modelos variádica
  • uma expressão constante (constexpr)
  • Literais definidos pelo usuário
  • e muito mais ...

Veja a lista completa aqui uma página wiki grande.

Conclusão

A terceira parte, a última, que acabou. Espero que pelo menos você tem uma introdução geral aos recursos de linguagem e impressionante biblioteca em C ++ 11. Encorajo-vos a cavar e leia mais sobre o moderno C ++.

O que você acha da série? Talvez eu tenha perdido alguma coisa importante? talvez algum argumento poderia ser melhor descrito? Por favor, compartilhe suas opiniões.

Veja: Parte 1 e Parte 2 Series

Recursos e links

  • @ Drdobbs.com c ++ 11s modelo assíncrono - tutorial sobre std :: async e linha
  • http://isocpp.org/ - site oficial cpp

Você também pode saber mais sobre o C ++ 11 ao blog de Bartek: www.bfilipek.com

A maioria dos ícones e imagens vêm de um ótimo site: openclipart.org

(0)
(0)

Comentários - 0

Sem comentários

Adicionar um comentário

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caracteres restantes: 3000
captcha