Compilando Templates C++

Neste artigo você verá um pouco sobre como Templates C++ funcionam e sobre técnicas de como compilá-los num ambiente modularizado.

[ Hits: 28.977 ]

Por: Hugo Benício em 05/03/2008 | Blog: http://lia.ufc.br/~hugobenicio/wordpress/


Entendendo melhor o problema



Primeiro, antes de resolver este impasse, vale a pena conferir como os templates em C++ funcionam. Com eles você pode escrever um código genérico ao se abstrair do tipo de variável do qual estamos tratando. Por exemplo:



Com este código, criamos uma função capaz de retornar a soma de 2 números. Mas então, você pode se perguntar: "Como o compilador vai saber a qual tipo de variável estamos nos referindo? Afinal, o código precisa ser compilado. E o compilador precisa saber o espaço que precisará alocar, caso a função seja chamada, e armazenar essa informação no binário gerado pela compilação."

É verdade, o compilador precisa dessa informação. E ele o obtém na hora da aplicação da função, ou seja, na hora em que chamarmos a função. Dessa forma, ao encontrar o código:



o compilador irá saber de que se trata de um:



e irá gerar o código necessário para tal função. E, se no mesmo código, tiver mais um:



o compilador irá gerar um código para double's também (da mesma forma que o anterior).

    Próxima página

Páginas do artigo
   1. Entendendo melhor o problema
   2. Ok, entendi, então qual é o problema?
   3. Solução 1 - Implementação da função no header (.hpp ou .h)
   4. Solução 2 - Incluindo o arquivo de implementação no arquivo de cabeçalho
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Como funcionam os alocadores de memória do STD C?

Tutorial OpenGL v3.0

Desenvolvendo para microcontroladores em GNU/Linux

Bug afeta todas as distros

Estudando recursividade direta e indireta

  
Comentários
[1] Comentário enviado por humbhenri em 05/03/2008 - 11:12h

Muito bom o artigo, parabéns. Pelo que eu me lembre na STL eles usam a solução 1.

[2] Comentário enviado por an_drade em 05/03/2008 - 12:07h

Olá hbobenicio,

Na realidade, você não compila o Template e seu código, e sim o código que usa este. Isto pode parecer uma boa solução (na realidade, o é) mas tem um inconveniente muito ruim: se você usa este template em 10 lugares diferentes em seu código (sei lá, imagine 10 classes distintas), o código do template será compilado 10 vezes. Isso é péssimo para programas grandes, onde temos bem mais de 10 classes distintas (ou mesmo, pedaços de códigos espalhados por vários arquivos). É só tentar compilar o Firefox ou o KDE (se não me engano, os 2 usam muitas das classes STL).

Uma vez li em algum lugar que existe uma maneira de pré-compilar estes templates, um processo parecido com pré-compilação dos arquivos de cabeçalho, aumentando a velocidade total de compilação. Este processo gera um código intermediário otimizado que facilita a compilação dos códigos que a utilizam.

[]'s

Carlos

[3] Comentário enviado por hbobenicio em 05/03/2008 - 12:42h

an_drade,

é verdade, os templates só podem ser compilados se não forem separados do código que os chamam, não tem como fugir disso. Na verdade é assim que eles funcionam... o compilador descobre quais são os tipos que o seu código usa/precisa e gera a informação necessária.

Essas, como eu cito no artigo, são os métodos "mais fáceis" de se fazer tão "façanha". O que é feito é uma simulação dos padrões de modularização.

Condordo, quando o programa toma grande dimensões é desaconselhável que se use muito (ou mesmo algum) templates no seu código. É o famoso TRADE-OFF: templates podem ser "uma mão na roda" r diminuir muito trabalho, mas se o projeto ganha proporções muito
grandes, podemos ter problemas como os citados por você. Cabe a cada programador fazer sua escolha :D

abraços e obrigado pelo comentário. (pro humbhenri também).

[4] Comentário enviado por hbobenicio em 05/03/2008 - 12:44h

É... Talvez eu devesse ter colocado como título do artigo:

" 'Compilando' templates C++"

ou

" 'Simulando' uma modularização com templates C++ "

ao invés de:

" Compilando templates C++ "

[5] Comentário enviado por daniel.franca em 23/05/2008 - 13:19h

Bom o artigo.
Fiquei com uma duvida, vc cita o fato do código ficar visivel a quem for usa-lo pelo primeiro método. Porém no segundo metodo isso tb ocorre já que o codigo fonte (.cpp) não poderá estar compilado.

Vi q vc tratá bastante de C nos artigos, eu encontrei um tutorial de ponteiros na internet, o achei muito bom. Eu postei ele no meu blog, se quiser conferir está em: http://tecnosapiens.wordpress.com
Dicas de posts e comentários tb são bem vindos.

[6] Comentário enviado por metalpunkpointer em 31/08/2010 - 11:31h

boa explicação, só não entendi aonde vc incluiu o header do stl...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts