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.904 ]

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

Alocação dinâmica

Instalando Facebook Folly através do Conan

Dynamic libraries com libtool

Desenvolvendo para microcontroladores em GNU/Linux

OneAPI: A plataforma da Intel para facilitar o desenvolvimento com chips Intel, AMD, ARM, NVIDIA POWER e FPGA

  
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