terça-feira, 16 de dezembro de 2014

E este tal de C++11?


Muito do conteúdo que vou postar aqui baseia-se nos recursos do C++11, então é natural começar falando um pouco desta nova versão da linguagem. O C++ é uma linguagem cuja evolução não é decidida por uma empresa, mas sim de forma democrática por um comitê internacional. Por estes e outros motivos, a evolução da linguagem é lenta.

Quando o C++ foi criado, no início dos anos 80 por Bjarne Stroustrup, o padrão de facto da linguagem era o seu livro "The C++ Programming Language". A partir dos anos 90 houve a preocupação em padronizar formalmente e internacionalmente a linguagem. Assim surgiram os padrões ISO/IEC para as versões C++98 (1998), C++03 (2003) e mais recentemente o C++11 (foi chamado por muito tempo de C++0x pois se esperava estar concluído ainda nos anos 200x). Este é atual padrão da linguagem C++, aprovado pelo comitê em agosto de 2011 e publicado pela ISO em set/2011 (ISO/IEC 14882:2011). Agora em 2014 foi feita uma revisão (informalmente C++14), já aprovada pelo comitê mas ainda não publicada até a presente data. A próxima grande atualização prevista é o C++17.

Onde conhecer C++11?

O documento oficial da versão atual da linguagem é o ISO/IEC 14882:2011. Como acontece com normas ISO, o documento é pago. A ABNT vende no Brasil por R$ 666,40. O draft final redigido pelo comitê está gratuitamente disponível em http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf.
Deve ser o mesmo conteúdo da versão paga (não a garantia disto), mas sem formatação. De qualquer forma, não é um documento para estudar ou aprender (a não ser como estudo de caso para uma cadeira de Linguagens Formais ou Compiladores!). Também não é um documento que apresente apenas as diferenças do C++11 para a versão anterior. Este é o atual standard, então toda a linguagem está descrita.

Principais fontes de pesquisa que eu usei/uso para pesquisa (random_shuffle'd):
  • A FAQ do Stroustrup;
  • O site cplusplus.com, aliás, minha principal referência online para a biblioteca padrão;
  • A edição atual do The C++ Programming Language. Ganhei um exemplar do meu aluno Natan Streppel. Valeu Natan! O livro é D+;
  • O Google, como todo mundo, né!

Quais são as diferenças do C++03 para o C++11?

Um único post não é espaço adequado para relacionar, sem ser muito superficial, a evolução que ocorreu. Vamos fazer isto em doses homeopáticas. Quem está ansioso olha na FAQ do Stroustrup.
Mas aí vai um pequeno exemplo, que disponibilizei no Ideone.com, e que ilustra algumas poucas novidades :


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
    int a[] {10, 48, 57, 23, -1, 12};

    cout << "Is sorted? "
         << boolalpha
         << is_sorted(begin(a), end(a))
         << endl;

    sort(begin(a), end(a));
    for(auto v : a)
        cout << v << '\n';

    return 0;
}

O que aparece de novo aí?

Vale a pena usar c++11?

Certamente. O principal ganho é em produtividade. Algumas coisas simples,  como o range-for, que a maioria das linguagens já tinha e faltava no C++; a inferência de tipo; as expressões lambda; o alinhamento com o C99 e as novas funções e classes da biblioteca padrão (Lista simplesmente encadeada, tabela hash, classes mais aprimoradas para medir tempo  do que a velha <time.h>, regex, geradores de números pseudo-aleatórios, para citar alguns exemplos) são muito úteis mesmo para um programador C++ básico/intermediário. Parte significativa da mudança será mais interessante para um programador que faça uso da Programação Orientada a Objetos e/ou Meta-programação por Templates mais a fundo.

Vale a pena migrar meu código para c++11?

Quem aí tem tempo para isto???? Não vejo necessidade em sair convertendo código legado.  Só a (re)compilação, em alguns casos específicos, já pode dar algum ganho de desempenho. Principalmente onde a nova Move semantic, pode permitir ao RVO (Return value optimization) eliminar cópias desnecessárias de grandes objetos como em uma função que retorna um container (um list<T>, por exemplo).

A única quebra de compatibilidade que identifiquei foi a mudança de semântica da palavra reservada auto. Antes era um modificador de tipo que indicava que a variável teria alocação automática, isto é deveria ser armazenada na pilha. Agora serve para inferência de tipo (o compilador irá detectar o tipo para a variável com base no valor usado para inicializá-la). Então este código, que antes era válido, agora gera erro de compilação.


1
auto int x=0;

Como compilar usando C++11?

Na linha de comando, basta incluir a flag -std=c++11 na chamada ao compilador g++

g++ -std=c++11 programa.cpp -o programa

No Code::Blocks, basta ligar esta opção no menu Settings/Compiler/Compiler Settings:



Experimentem, explorem, divirtam-se. É assim que se deve (re)aprender programação!

Nenhum comentário:

Postar um comentário