Compartilhar via


Este artigo foi traduzido por máquina.

Visual C++

Explorando os novos recursos de C++ e MFC no Visual Studio 2010

Sumit Kumar

Visual Studio 2010 apresenta enormes benefícios para os desenvolvedores de C++. Da capacidade de empregar os novos recursos oferecidos pelo Windows 7 aos recursos de produtividade aprimorada para trabalhar com bases de código grande, há algo novo e aprimorado para praticamente todos os desenvolvedores de C++.

Neste artigo, explicarei como a Microsoft tem tratado alguns dos problemas amplas enfrentados por desenvolvedores de C++. Especificamente, 
Visual Studio 2010 ativa um modelo de programação mais moderno adicionando principais recursos da linguagem do C futuro ++ 0 x padrão e por overhauling a biblioteca padrão para tirar proveito dos novos recursos de linguagem. Há novas bibliotecas de programação paralelas e ferramentas para simplificar a criação de programas em paralelo. Você também encontrará produtividade aprimorada geral de desempenho e desenvolvedor graças aos recursos de compreensão do código que se expandir para bases de código grandes e IntelliSense. E vai se beneficiar o desempenho aprimorado de bibliotecas e outros recursos em tempo 
design, hora da compilação, compilar o tempo de link e.

Visual Studio 2010 migra o sistema de compilação para MSBuild para torná-lo mais personalizável e para oferecer suporte a multi-direcionamento nativo. E aprimoramentos no biblioteca MFC aproveitar o poder de novas APIs do Windows 7, permitindo que você escrever aplicativos do Windows 7 excelentes.

Let’s dê uma olhada mais detalhada desses avanços com foco em C++ no Visual Studio 2010.

C ++ 0 x recursos lingüísticos Core

O próximo padrão de C++ é inching mais próximo ao que está sendo finalizado. Para ajudar você a se familiarizar com o C ++ 0 x extensões, o compilador do Visual C++ no Visual Studio 2010 permite seis C ++ 0 x principais recursos de idioma: as expressões lambda, a palavra-chave auto, rvalue referências, static_assert, nullptr e decltype.

As expressões lambda implicitamente definem e construir objetos de função sem nome. Lambdas fornecem uma sintaxe simples natural para definir objetos de função em que eles são usados, sem incorrer em sobrecarga de desempenho.

Objetos de função são uma maneira muito poderosa para personalizar o comportamento dos algoritmos da STL (Standard Template Library) e podem encapsular o código e dados (ao contrário das funções simples). Mas os objetos de função são inconvenientes definir a causa da necessidade de escrever classes inteiras. Além disso, eles não são definidos no local em seu código-fonte onde você está tentando usá-los e a localidade não-torna mais difícil de usar. Bibliotecas tentaram atenuar alguns dos problemas de detalhamento e Don da localidade, mas Don oferecem ajuda muito porque a sintaxe torna-se complicados e os erros do compilador Don são muito amigáveis. Usando objetos de função de bibliotecas também é menos eficiente desde os objetos de função definidos como membros de dados não estão na-alinhados.

As expressões lambda resolver esses problemas. O trecho de código a seguir mostra uma expressão lambda usada em um programa para remover números inteiros entre as variáveis x e y de um vetor de inteiros.

v.erase(remove_if(v.begin(),
   v.end(), [x, y](int n) { 
   return x < n && n < y; }),
   v.end());

A segunda linha mostra a expressão lambda. Colchetes, chamados lambda-introducer, indique a definição de uma expressão lambda. Este lambda leva inteiro n como um parâmetro e o objeto de função lambda gerado tem os membros de dados x e y. Compare isso a um objeto de função manuscritas equivalente para obter uma apreciação da conveniência e fornecem lambdas de economia de tempo:

class LambdaFunctor {
public:
  LambdaFunctor(int a, int b) : m_a(a), m_b(b) { }
  bool operator()(int n) const {
    return m_a < n && n < m_b; }
private:
  int m_a;
  int m_b;
};
v.erase(remove_if(v.begin(), v.end(),
  LambdaFunctor(x, y)), v.end());

A palavra-chave auto sempre existiu em C++, mas ele foi usado raramente porque nenhum valor adicional. C ++ 0 x repurposes esta palavra-chave para determinar automaticamente o tipo de uma variável do seu inicializador. Automática reduz o nível de detalhes e ajuda a código importantes para destacar. Ele evita incompatibilidades de tipos e erros de truncamento. Ele também ajuda a tornar o código mais genérica, permitindo que os modelos a serem gravados que se preocupar com menor sobre os tipos de expressões intermediários e efetivamente as negociações com tipos, não documentados como lambdas. Este código mostra como automático evita que você digitar o tipo de modelo para loop Iterando um vetor:

vector<int> v;
for (auto i = v.begin(); i != v.end(); ++i) {
// code 
}

Referências Rvalue são um novo tipo de referência introduzido no C ++ 0 x que ajudam a resolver o problema de copiar desnecessárias e ativar o encaminhamento perfeito. Quando um rvalue lado direito de uma atribuição, em seguida, o objeto do lado esquerdo possa roubar nomes de recursos do objeto do lado direito vez realizar uma alocação separada, permitindo mover semântica.

Encaminhamento perfeito permite que você escreva um modelo de função única que leva argumentos arbitrários n e as encaminha transparentemente para outra função arbitrária. A natureza do argumento (lvalue modificável, const, ou rvalue) é preservada nesse processo de encaminhamento.

template <typename T1, typename T2> void functionA(T1&& t1, T2&& t2) {
  functionB(std::forward<T1>(t1), std::forward<T2>(t2));
}

Uma explicação detalhada das referências rvalue está fora do escopo deste artigo, verifique a documentação do MSDN em MSDN.Microsoft.com/Library/dd293668(VS.100) para obter mais informações.

Static_assert permite declarações de testes em tempo de compilação em vez de em tempo de execução. Ele permite que você acionar erros do compilador com mensagens de erro personalizadas que são fáceis de ler. Static_assert é especialmente útil para validação de parâmetros de modelo. Por exemplo, compilar o código a seguir irá informar o erro “ Erro C2338: declaração personalizada: n deve ser menor que 5 ”:

template <int n> struct StructA {
  static_assert(n < 5, "custom assert: n should be less than 5");
};

int _tmain(int argc, _TCHAR* argv[]) {
  StructA<4> s1;
  StructA<6> s2;
  return 0;
}

Nullptr adiciona segurança de tipos para ponteiros nulos e está intimamente relacionada com rvalue referências. A macro NULL (definido como 0) e 0 literal são normalmente usados como ponteiro nulo. Até o momento que Don tenha sido um problema, mas eles Don funcionam muito bem em C ++ 0 x devido a possíveis problemas no encaminhamento perfeito. Portanto, a palavra-chave nullptr foi introduzida principalmente para evitar falhas misteriosas nas funções de encaminhamento perfeito.

Nullptr é uma constante do tipo nullptr_t, que é conversível para qualquer tipo de ponteiro, mas não para outros tipos como int ou char. Juntamente com sendo usados em funções de encaminhamento perfeito, nullptr pode ser usado em qualquer lugar a macro NULL foi usada como um ponteiro nulo.

Observe A advertência, no entanto: NULL ainda é suportado pelo compilador e ainda não foi substituído pelo nullptr. Isso é principalmente para evitar a quebra de código existente devido ao uso freqüentemente inadequado e difundido de NULL. Mas no futuro, nullptr deve ser usado em todos os lugares que NULL foi usado e NULL deve ser tratado como um recurso criado para oferecer suporte à compatibilidade com versões anteriores.

Por fim, decltype permite que o compilador inferir o tipo de retorno de uma função com base em uma expressão arbitrária e torna mais genérico encaminhamento perfeito. Em versões para dois tipos arbitrários T1 e T2, anteriores não era possível deduzir o tipo de uma expressão que usou esses dois tipos. O recurso decltype permite ao estado, por exemplo, uma expressão que tem os argumentos de modelo, como soma < T1, T2>() tem o tipo de T1 + T2.

Aprimoramentos de biblioteca padrão

Substanciais partes da biblioteca C++ padrão tiverem sido reescritas para tirar proveito dos novo C ++ 0 x recursos de linguagem e aumentam o desempenho. Além disso, muitos algoritmos novos foram introduzidos.

A biblioteca padrão aproveita ao máximo rvalue referências para melhorar o desempenho. Tipos como vetor e lista agora tem construtores de movimentação e mover operadores de atribuição de seus próprios. Realocações vetor a aproveitar semântica de movimentação, pegar os construtores de movimentação, assim, se têm de seus tipos mova construtores e operadores de atribuição de movimentação, a biblioteca pega que automaticamente.

Agora você pode criar um ponteiro para um objeto compartilhado ao mesmo tempo são construir o objeto com a Ajuda do novo C ++ 0 x função modelo make_shared <t>:

auto sp = 
  make_shared<map<string,vector>>
  (args);

No Visual Studio 2008 você precisaria escrever o seguinte para obter a mesma funcionalidade:

shared_ptr<map<string,vector>> 
  sp(new map<string,vector>(args));

Usar make_shared <t>é mais conveniente (você precisará digitar o nome do tipo vezes menos), mais robusta (ele evita o vazamento clássico shared_ptr sem nome porque o ponteiro e o objeto estão sendo criados simultaneamente) e mais eficiente (ele executa uma alocação de memória dinâmica, em vez de dois). 

A biblioteca agora contém um tipo de ponteiro inteligente nova e mais seguro, unique_ptr (que foi ativada pelo rvalue referências). Como resultado, auto_ptr está mais em uso; unique_ptr evita as armadilhas de auto_ptr, sendo móvel, mas não copyable. Ele permite que você implementar a semântica de propriedade estrito sem afetar a segurança. Ele também funciona bem com contêineres de Visual C++ 2010 estão cientes das referências rvalue.

Recipientes agora possuem novas funções de membro — cbegin e cend — que fornecem uma maneira de usar um const_iterator para inspeção independentemente do tipo de recipiente:

vector<int> v;
 
for (auto i = v.cbegin(); i != v.cend(); ++i) {
  // i is vector<int>::const_iterator
}

Visual Studio 2010 adiciona a maioria dos algoritmos propostas em diversas C ++ 0 papers x para a biblioteca padrão. Um subconjunto da biblioteca de conversões do Dinkumware agora está disponível na biblioteca padrão, isso agora, você pode fazer conversões como UTF-8 para UTF-16 com facilidade. A biblioteca padrão permite que a propagação de exceção via exception_ptr. Muitas atualizações foram feitas no cabeçalho <random>. Há uma lista vinculada separada chamada forward_list nesta versão. A biblioteca tem um cabeçalho <system_error> para melhorar o diagnóstico. Além disso, muitos dos recursos de TR1 que existiam no namespace std::tr1 na versão anterior (como shared_ptr e regex) agora são parte da biblioteca padrão sob o namespace std.

Aprimoramentos de programação simultânea

Visual Studio 2010 introduz a plataforma de computação paralela, que ajuda a escrever código paralelo de alto desempenho rapidamente, evitando bugs simultâneos sutis. Isso permite que você Subexposição alguns dos problemas clássicos relacionados à simultaneidade.

A plataforma de computação paralela tem quatro partes principais: o tempo de execução de simultaneidade (ConcRT), PPL (biblioteca de padrões paralelo), biblioteca agentes assíncronos e paralelo para criação de perfis e depuração.

ConcRT é a camada de software mais baixa que fala com o sistema operacional e arbitra entre vários componentes simultâneas competindo pelos recursos. Porque é um processo no modo de usuário, ele pode recuperar recursos quando seus mecanismos de bloqueio cooperativos são usados. ConcRT está ciente de localidade e evita a alternância de tarefas entre processadores diferentes. Ele emprega Windows 7 User Mode Scheduling (UMS) para que ela pode melhorar o desempenho, mesmo quando o 
mechanism bloqueio cooperativo não é usado.

PPL fornece os padrões para escrever código paralelo. Se uma computação pode ser decomposta em sub-computations podem ser representados por funções ou objetos de função, cada um desses sub-computations pode ser representada por uma tarefa. O conceito de tarefas é muito mais perto do domínio do problema, ao contrário dos threads que leva para fora do domínio problemático, tornando pensar sobre o hardware, sistema operacional, as seções críticas e assim por diante. Uma tarefa pode executar simultaneamente com outras tarefas independentes do que estão fazendo outras tarefas. Por exemplo, duas metades diferentes de um 
array a classificação pode ser feita por duas tarefas diferentes simultaneamente.

PPL inclui classes paralelas (task_handle task_group recipientes e structured_task_group), algoritmos paralelos (parallel_invoke, parallel_for e parallel_for_each) paralelas (concurrent_queue combinado, e concurrent_vector) e com reconhecimento de ConcRT primitivos de sincronização (critical_section, eventos e reader_writer_lock) que trate tarefas como um conceito de primeira classe. Todos os componentes da PPL em tempo real no namespace simultaneidade.

Grupos de tarefas permitem que você executar um conjunto de tarefas e aguarde até que todos eles terminar. Assim, no exemplo a classificação, as tarefas de tratamento duas metades da matriz podem fazer um grupo de tarefas. Você têm a garantia de que essas duas tarefas são concluídas no final da chamada de função de membro espera, conforme mostrado no exemplo de código de um quicksort recursiva escrito usando tarefas paralelas e lambdas:

void quicksort(vector<int>::iterator first,
vector<int>::iterator last) {
  if (last - first < 2) { return; }
  int pivot = *first;
  auto mid1 = partition(first, last, [=](int elem) { 
    return elem < pivot; });
  auto mid2 = partition( mid1, last, [=](int elem) { 
    return elem == pivot; });
  task_group g;
  g.run([=] { quicksort(first, mid1); });
  g.run([=] { quicksort(mid2, last); });
  g.wait();
}

Isso pode ser melhorado ainda mais usando um grupo de tarefas estruturadas habilitado pelo algoritmo parallel_invoke. Ele utiliza de dois a dez objetos de função e executa todas elas em paralelo usando quantos núcleos ConcRT fornece e espera finalizar a:

parallel_invoke(
  [=] { quicksort(first, mid1); },
  [=] { quicksort(mid2, last); } );

parallel_invoke(
  [=] { quicksort(first, mid1); },
  [=] { quicksort(mid2, last); } );

Pode haver várias subtarefas criadas por cada uma dessas tarefas. O mapeamento entre as tarefas e segmentos de execução (e garantindo que todos os núcleos sejam utilizados da maneira ideal) são gerenciados pelo ConcRT. Então decompondo a computação em quantas tarefas possível ajudará a aproveitar todos os núcleos disponíveis.

Outro algoritmo paralelo útil é parallel_for, que pode ser usado para iterar sobre índices de forma simultânea:

parallel_for(first, last, functor);
parallel_for(first, last, step, functor);

Isso chama o objetos de função com cada índice começando 
with primeiro e terminando com o último simultaneamente.

A biblioteca de agentes assíncronos oferece um modelo de programação do fluxo de dados onde computações dependem os dados necessários, tornando-se disponível. A biblioteca é baseada nos conceitos de agentes, blocos de mensagens e funções de transmissão de mensagens. Um agente é um componente de um aplicativo que oferece determinados cálculos e se comunica assincronamente com outros agentes para resolver um problema maior de computação. Essa comunicação entre agentes é obtida por meio de funções de transmissão de mensagens e blocos de mensagens.

Agentes têm um ciclo de vida observável passa por vários estágios. Eles não devem ser usados para o paralelismo refinado alcançado usando PPL tarefas. Os agentes são criados nos componentes de gerenciamento de recursos e agendamento de ConcRT e ajuda que você evita os problemas que surgem do uso da memória compartilhada em aplicativos simultâneos.

Você não precisa vincular contra ou redistribuir qualquer componente adicional para aproveitar esses padrões. ConcRT, PPL e a biblioteca de agentes assíncronos foram implementadas no msvcr100.dll, msvcp100.dll e libcmt.lib/libcpmt.lib juntamente com a biblioteca padrão. PPL e a biblioteca de agentes assíncronos são principalmente implementações somente cabeçalho.

O depurador do Visual Studio agora está ciente do ConcRT e torna mais fácil para depurar problemas de simultaneidade — ao contrário do Visual Studio 2008, que tinha há conhecimento dos conceitos paralelos nível mais alto. Visual Studio 2010 tem um gerador de perfil de simultaneidade que lhe permite visualizar o comportamento de aplicativos em paralelo. O depurador tem novas janelas visualizar o estado de todas as tarefas em um aplicativo e suas pilhas de chamada. Figura 1 mostra as janelas de tarefas paralelas e pilhas paralelo.

Figure 1 Parallel Stacks and Parallel Tasks Debug Windows
Figura 1 Pilhas paralelas e tarefas paralelas de depuração do Windows

O IntelliSense e produtividade de tempo de design

Um novo em folha IntelliSense e a infra-estrutura de navegação está incluído no Visual Studio 2010. Bem como ajudando em escala e capacidade de resposta em projetos com bases de código grandes, os aperfeiçoamentos na infra-estrutura habilitou alguns recursos de produtividade de tempo de design novo.

Recursos do IntelliSense como relatório de erros em tempo real e dicas de ferramentas de informações rápidas baseiam-se em um novo compilador front-end, que analisa a unidade de tradução completa para fornecer informações ricos e precisas sobre semântica de código, mesmo enquanto os arquivos de código estão sendo modificados.

Todos os recursos de navegação de código, como o modo de exibição de classe e hierarquia de classes, agora usam as informações de código de origem armazenadas em um banco de dados SQL, que permite a indexação e tem uma capacidade de memória fixa. Ao contrário das versões anteriores, o IDE do Visual Studio 2010 é sempre responsivo e você não precise aguardar enquanto as unidades de compilação obtém reparsed em resposta às alterações em um arquivo de cabeçalho.

(Os familiares rabiscos vermelhos) o relatório de erros em tempo real do IntelliSense exibe a sintaxe de qualidade de compilador e erros semânticos durante a navegação e edição de código. Posicionar o mouse sobre o erro lhe dá a mensagem de erro (consulte Figura 2). A janela de lista de erro também mostra o erro do arquivo sendo exibido no momento, bem como erros do IntelliSense a partir de outro local na unidade de compilação. Todas essas informações está disponível para você sem fazer uma compilação.

Figure 2 Live Error Reporting Showing IntelliSense Errors
Figura 2 Erros de IntelliSense Mostrar relatório de erros do Live

Além disso, uma lista de relevantes incluem arquivos é exibida em uma lista suspensa enquanto digitando # incluem e aperfeiçoa a lista conforme você digita.

Novo navegar para (Editar | para navegar ou CTRL + vírgula) recurso ajudará a ser mais produtivo com pesquisa de arquivo ou símbolo. Esse recurso oferece resultados de pesquisa em tempo real, com base em substrings conforme você digita, correspondência de suas seqüências de caracteres de entrada para símbolos e arquivos em qualquer projeto (consulte Figura 3). Esse recurso também funciona para arquivos translation from VPE for Csharp e Visual Basic e é extensível.

Figure 3 Using the Navigate To Feature
Figura 3 Usando a navegar para o recurso

Hierarquia de chamada (chamados usando CTRL+K, CTRL+T ou a partir do menu do botão direito do mouse) permite que você navegar para todas as funções de chamada de uma função específica e de todas as funções que fazem chamadas para uma função específica. Esta é uma versão aprimorada do recurso do navegador de chamada que existiam nas versões anteriores do Visual Studio. A janela hierarquia de chamada muito melhor é organizada e fornece chama e chama árvores para qualquer função que aparece na mesma janela.

Observe que, enquanto todos os os recursos de navegação de código estão disponíveis para puro C++ e C + c++ / CLI, recursos relacionados ao IntelliSense, como relatórios de erros do live e informações rápidas não estarão disponíveis para o C + c++ / CLI na versão final do Visual Studio 2010. 

Outros recursos do editor de grampeamento aperfeiçoados nesta versão, muito. Por exemplo, o recurso Localizar todas as referências popular que é usado para pesquisar por referências aos elementos de código (classes, membros de classe, funções e assim por diante) dentro de toda a solução agora é mais flexível. Os resultados da pesquisa podem ser 
further refinado usando uma opção de resolver resultados no menu de contexto com o botão direito do mouse.

Código inativo agora retém informações semânticas mantendo colorização (em vez de becoming cinza). Figura 4 mostra como o código inativo estiver esmaecido, mas ainda mostra diferentes cores para transmitir informações semânticas.

Figure 4 Inactive Code Blocks Retain Colorization
Figura 4 Blocos de código inativo retém colorização

Juntamente com os recursos já descritos, a experiência geral do editor foi aperfeiçoada no Visual Studio 2010. O IDE com base no Windows Presentation Foundation WPF novo foi reprojetado para remover resíduos e melhorar a legibilidade. Janelas como editor de código e design, modo de exibição agora pode flutuar fora da janela principal do IDE e pode ser exibido em vários monitores do documento. É mais fácil e diminuir o zoom na janela do editor de código usando a tecla CTRL e o mecanismo cíclico do mouse. O IDE também melhorou o suporte para extensibilidade.

Compilação e sistemas de projeto

Visual Studio 2010 também apresenta melhorias substanciais no sistema compilação e o sistema de projeto para projetos C++.

A alteração mais importante é que o MSBuild agora é usado para construir projetos C++. MSBuild é um mecanismo de orquestração de compilação extensível, com base em XML que foi usado para projetos translation from VPE for Csharp e Visual Basic em versões anteriores do Visual Studio. MSBuild é agora o sistema para todos os idiomas de compilação Microsoft comuns. Ele pode ser usado no laboratório de compilação e máquinas de desenvolvedores individuais.

Processos de compilação do C++ agora são definidos em termos de arquivos de destino e a tarefa MSBuild e proporcionam um grau maior de capacidade de personalização, controle e transparência.

O tipo de projeto C++ tem uma nova extensão: .vcxproj. O Visual Studio irá atualizar automaticamente arquivos .vcproj antigos e soluções para o novo formato. Há também uma ferramenta de linha de comando, vcupgrade.exe para atualizar projetos único a partir da linha de comando.

No passado, você poderia usar apenas o conjunto de ferramentas (compilador, bibliotecas e assim por diante) fornecido com sua versão atual do Visual Studio. Era necessário esperar até que você estava pronto para migrar para o novo conjunto de ferramentas antes de poderia começar a usar o IDE novo. Visual Studio 2010 resolve esse problema, permitindo que você direcione várias versões de conjunto de ferramentas para criar contra. Por exemplo, você pode direcionar o compilador do Visual C++ 9.0 e bibliotecas enquanto estiver trabalhando no Visual Studio 2010. Figura 5 mostra as configurações de multi-direcionamento nativas na página de propriedades.

5 Targeting Multiple Platform Toolsets
Figura 5 Direcionamento de vários conjuntos de ferramentas de plataforma

Uso MSBuild torna o C++ muito mais extensível do sistema de compilação. Quando o sistema de compilação padrão não é suficiente para atender às suas necessidades, você poderá estendê-lo adicionando sua própria ferramenta ou qualquer outra etapa de compilação. MSBuild usa tarefas como unidades reutilizáveis do código executável para executar as operações de compilação. Você pode criar suas próprias tarefas e estender o sistema de compilação definindo-os em um arquivo XML. MSBuild gera as tarefas desses arquivos XML com o sistema em funcionamento.

As plataformas existentes e conjuntos de ferramentas podem ser estendidos adicionando arquivos .props e .targets para etapas adicionais para pastas ImportBefore e ImportAfter. Isso é especialmente útil para provedores de bibliotecas e ferramentas que gostariam de estender o existente criar sistemas. Você também pode definir seu próprio conjunto de ferramentas da plataforma. Além disso, o MSBuild fornece melhores informações de diagnóstico para facilitar depurar problemas de compilação, que também tornam incrementais baseia-se mais confiáveis. Além disso, você pode criar sistemas de compilação que são mais intimamente vinculados ao controle de origem e de laboratório de compilação e menos depende da configuração de máquina do desenvolvedor.

O sistema de projeto que fica na parte superior do sistema de compilação também tira proveito da flexibilidade e extensibilidade fornecido pelo MSBuild. O sistema de projeto compreende os processos do MSBuild e permite que o Visual Studio, de forma transparente, exibir informações disponibilizadas pela MSBuild.

Personalizações são visíveis e podem ser configuradas por meio das páginas de propriedade. Você pode configurar o sistema de projeto para usar sua própria plataforma (como existentes plataformas x 86 ou x64) ou seu depurador. As páginas de propriedades permitem que você escreve e integrar componentes atualizar dinamicamente o valor das propriedades que dependem de contexto. O sistema de projeto do Visual Studio 2010 ainda permite que você escrever suas próprias interfaces do usuário personalizado para ler e gravar propriedades em vez de usar páginas de propriedades.

Compilação mais rápida e melhor desempenho

Juntamente com os aperfeiçoamentos em tempo de design descritos até agora, o Visual Studio 2010 também melhora a velocidade de compilação, qualidade e desempenho para aplicativos criados com o compilador do Visual C++, como resultado da geração de código vários aprimoramentos para o compilador de back-end.

O desempenho de alguns aplicativos depende do conjunto de trabalho. O tamanho do código para o x64 arquitetura foi reduzida no intervalo de 3 a 10 % fazendo várias otimizações nesta versão, resultando em um melhor desempenho para tais aplicativos.

Único de geração de código SIMD (Instruction Multiple Data) — que é importante para desenvolvedores de jogo, áudio, vídeo e imagens — foi otimizado para melhor qualidade de desempenho e código. As melhorias incluem quebrar as dependências falsas, vetorização de inicializações de vetor constante e a melhor alocação dos XMM registra para remover cargas redundantes, armazena e move. Além disso, foi otimizada the__mm_set_ **, __mm_setr_ ** e __mm_set1_ ** família intrínseca.

Para melhorar o desempenho, aplicativos devem ser criados usando o link Time Code Generation (LTCG) e PGO (otimização interativa perfil).

Velocidade de compilação em plataformas x64 foi aprimorada, tornando otimizações no x geração de código de 64. Compilação com LTCG, recomendada para melhor otimização, normalmente leva mais de compilação não LTCG principalmente em aplicativos grandes. No Visual Studio 2010, compilação LTCG melhorou em 30 %. Um thread dedicado para gravar arquivos PDB foi apresentado nesta versão, portanto, você verá aperfeiçoamentos de tempo do link quando você usa o /Debug alternar.

Foram feitas PGO instrumentação executa mais rápido adicionando suporte para versões não-bloqueio do binários instrumentados. Há também uma nova opção POGO, PogoSafeMode, que permite que você especifique se deseja usar o modo de segurança ou modo rápido quando você otimizar um aplicativo. Modo rápido é o comportamento padrão. O modo de segurança é thread-safe, mas mais lento do que o modo rápido.

Melhorou a qualidade do código gerado pelo compilador. Agora há suporte total para Advanced Vector Extensions (AVX), que são muito importantes para floating-point aplicativos com uso intensivo de processadores AMD e Intel via intrínseca e /arch:AVX opções. Computação de ponto flutuante é mais precisa com a opção /fp:fast.

Criando aplicativos para o Windows 7

Windows 7 introduziu um número de novas tecnologias interessantes e recursos e adicionadas novas APIs e Visual Studio 2010 oferece acesso a todas as novas APIs do Windows. Os componentes do Windows SDK necessários para escrever código para APIs nativas do Windows estão incluídos no Visual Studio 2010. Você pode tirar proveito das inovações como 11 Direct3D, DirectWrite, Direct2D e APIs de serviço Web Windows usando o SDK cabeçalhos e bibliotecas disponíveis no Visual Studio 2010.

Como disponibilizar todas as APIs do Windows para desenvolvedores, esta versão do Visual Studio também torna mais fácil para escrever aplicativos para Windows com a Ajuda do MFC beefed até. Você obtém acesso à funcionalidade substancial do Windows 7 por meio de bibliotecas de MFC sem precisar escrever diretamente para APIs nativas. Os aplicativos MFC existentes se acenderá no Windows 7 por apenas recompilar. E os novos aplicativos podem aproveitar completa dos novos recursos.

MFC agora inclui a integração aprimorada com o shell do Windows. Integração do aplicativo com o Windows Explorer agora pode ser muito melhor pela tomada de usar dos manipuladores de arquivo para visualização, miniaturas e pesquisa que foram adicionados nesta versão. Esses recursos são fornecidos como opções no Assistente do aplicativo MFC, conforme mostrado no Figura 6. MFC irá gerar automaticamente o projeto ATL DLL que implementa esses manipuladores.

Figure 6 MFC Application Wizard with File Handler Options
Figura 6 MFC Application Wizard com opções de manipulador de arquivo

Uma das alterações de interface de usuário mais perceptíveis no Windows 7 é a nova barra de tarefas. Com MFC permite que você tire proveito dos recursos como passar listas, rapidamente guias miniaturas, visualização em miniatura, as barras de progresso, sobreposição de ícone e assim por diante. Figura 7 mostra visualizações em miniatura e miniaturas com guias para um aplicativo MDI MFC com guias.

Figure 7 Tabbed Thumbnail and Thumbnail Preview in an MFC Application
Figura 7 Miniatura com guias e visualizar miniaturas em um aplicativo MFC

Interface do usuário da faixa de opções agora tem uma faixa de opções de estilo 7 do Windows, demais e seu aplicativo pode trocar a interface do usuário imediatamente qualquer momento durante o desenvolvimento de várias faixas de opções de estilo do Office para fita do Windows 7 usando a lista suspensa estilo conforme mostrado no Figura 8.

Figure 8 Ribbon-Style Dropdown in an MFC Application
Figura 8 Lista suspensa Estilo da faixa de opções em um aplicativo MFC

MFC permite que os aplicativos se tornar ciente multi-touch e chamadas de mensagens apropriadas para você controlar quando os diversos eventos de toque ocorrer. Apenas se registrar para eventos de toque e gesto roteará esses eventos para seu aplicativo. MFC também torna os aplicativos com alto DPI-reconhecimento por padrão, de forma que se adaptem a telas de DPI alta e não parecer pixelada ou imprecisa. MFC internamente dimensiona e altera fontes e outros elementos para certificar-se de que a interface do usuário continua a procurar nítidas em monitores DPI altas.

Juntamente com os novos recursos do Windows 7, alguns outros recursos do Windows que existem desde o Windows Vista, mas não foram incluídos nas versões anteriores do MFC foram incluídos agora. Por exemplo, o Gerenciador de reinicialização é um recurso útil introduzido no Windows Vista que permite que um aplicativo executar um aplicativo salvar antes de encerrar. O aplicativo pode chamar esse recurso e, em seguida, restaurar seu estado ao reiniciar. Agora você pode tirar o máximo proveito do Gerenciador de reinicialização em seu aplicativo MFC para lidar com panes e reinicializações de modo mais elegante. Basta adicione uma linha de código para permitir reinicialização e recuperação em seu aplicativo existente:

CMyApp::CMyApp() {
  m_dwRestartManagerSupportFlags = 
    AFX_RESTART_MANAGER_SUPPORT_RESTART;
// other lines of code ...
}

Novos aplicativos MFC obtém essa funcionalidade automaticamente usando o Assistente de aplicativos MFC. O mecanismo de salvamento automático está disponível para aplicativos que salvar os documentos e o intervalo de salvamento automático pode ser definido pelo usuário. Aplicativos podem escolher apenas reinicialização suporte ou aplicativo recover início (aplicável a aplicativos de tipo de doc/exibir) no Assistente de aplicativos MFC.

Adição de outra é a caixa de diálogo de tarefas do Windows, que é um tipo de mensagem aprimorado caixa (veja Figura 9). MFC agora tem um invólucro da caixa de diálogo de tarefa que você pode usar em seus aplicativos.

Figure 9 Task Dialog
Figura 9 Caixa de diálogo de tarefa

MFC Class Wizard É parte de trás

Não só foi nova funcionalidade adicionada na biblioteca MFC, essa versão também torna mais fácil trabalhar com MFC no Visual Studio IDE. Um dos mais comumente solicitada recursos, o Assistente de classe do MFC (mostrada em Figura 10), foi trazidas de volta e aprimorado. Agora você pode adicionar classes, manipuladores de eventos e outros elementos de seu aplicativo usando o Assistente de classe do MFC.

Figure 10 MFC Class Wizard
Figura 10 **Assistente de classes do MFC **

Adição de outra é o Designer de faixa de opções, que permite que você projetar sua interface do usuário da faixa de opções (em vez de definir a ele no código como no Visual Studio 2008) e armazená-lo como um recurso XML graficamente. Esse designer é obviamente útil para a criação de novos aplicativos, mas os aplicativos existentes também podem aproveitar as vantagens do designer para atualizar suas interfaces do usuário. A definição XML pode ser criada apenas adicionando uma linha de código temporariamente a definição do código existente da interface do usuário da faixa de opções:

m_wndRibbonBar.SaveToXMLFile(L"YourRibbon.mfcribbon-ms");

O arquivo XML resultante pode ser consumido, em seguida, como um arquivo de recurso e ainda mais as modificações podem ser feitas usando o Designer de faixa de opções.

Resumo

Visual Studio 2010 é uma versão principal na evolução do Visual C++ e facilita a vida dos desenvolvedores de várias maneiras. Eu quase não tem uma pequena amostra vários aprimoramentos relacionados ao C++ neste artigo. Para mais informações sobre recursos diferentes, consulte a documentação do MSDN e para o blog da equipe do Visual C++ em blogs.msdn.com/vcblog, que também foi usada como base para algumas das seções deste artigo.

Sumit Kumar é gerente de programa na equipe do Visual C++ IDE. Ele é um grau MS em ciência da Universidade do Texas em Dallas.

Graças aos seguintes especialistas técnicos: Stephan T. Lavavej, Marian Luparu e Tarek Madkour