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: 29.334 ]

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


Solução 2 - Incluindo o arquivo de implementação no arquivo de cabeçalho



Alguns programadores relutam em usar o método 1 apresentado acima, pois ele mistura a implementação com a definição da função. Imagine uma empresa querendo vender um programa, mas não quer divulgar o seu código fonte (implementação). Para que o programa funcione, obviamente as bibliotecas usadas e os objetos compilados são estritamente necessários para o funcionamento do programa. Com certeza, a empresa não gostaria muito de deixar funções de implementação em suas bibliotecas.

Como alternativa ao método 1, uma outra alternativa é pode ser aplicada:

arquivo.hpp:



arquivo.cpp:



main.cpp:



Com isso teremos abstração (definição e implementação da função) e aplicação (utilização da função) no mesmo arquivo que será compilado, o main.cpp. Dessa forma o compilador saberá o que fazer.

Este método é praticamente o mesmo que o 1º. A única diferença é que separamos a implementação da definição da função.

Como toda a informação se encontra indiretamente no main.cpp, a compilação do arquivo.cpp torna-se desnecessária.

Bom, basicamente é isso. Estes são os dois métodos mais utilizados, e relativamente fáceis.

Espero ter ajudado. :)

Obs.: Quaisquer dúvidas ou correções de alguma besteira que eu possa ter dito, me corrijam, por favor! ;)

Glossário

Aqui vão algumas descrições sobre termos um pouco mais técnicos utilizados no artigo.
  • Abstração: é onde definimos/implementamos a função; onde escrevemos o seu código.
  • Aplicação: é onde utilizamos/chamamos a função.
  • Implementação de função: é onde escrevemos o código da função.
  • Modularização: é um padrão/técnica de projeto na qual "quebramos" a solução do problema em módulos. Veja mais detalhes na wikipedia aqui.

Página anterior    

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

A mágica do polimorfismo e seus conceitos na ótica de C/C++

Sinais em Linux

Parâmetros interessantes do scanf e do printf em C

Cuidado com números em Ponto Flutuante

Alocação dinâmica de memória em C

  
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