paulo1205
(usa Ubuntu)
Enviado em 29/03/2016 - 16:55h
Existe um problema generalizado de compreensão a respeito de
inline em C++. Em parte esse problema se deve a uma ligeira mudança de sentido, causada pelo uso. Eu mesmo demorei para entender a questão (e nem sei se compreendi totalmente), e por isso mesmo vou tentar explicar pelo menos o aspecto mais básico.
Historicamente, dizer que uma função era
inline funcionava como uma dica para o compilador de que o chamada a tal função deveriam ser expandidas com o código que ia no interior da definição da função em cada ponto em que ela for chamada. Grosseiramente falando, o efeito seria semelhante a tornar o primeiro código abaixo equivalente ao segundo.
inline int twice(int n){ return n+n; }
void f(){
int x=twice(5);
/* ... */
}
void g(){
int a=1, b=2;
int c=twice(++a)-twice(b++);
/* ... */
}
void f(){
int x;
{ int temp=5; x=(temp+temp); }
/* ... */
}
void g(){
int a=1, b=2;
int c;
{ int temp1=++a, temp2=b++; c=(temp1+temp1)-(temp2+temp2); }
/* ... */
}
Mas mesmo na visão tradicional, esse tipo de equivalência nem sempre era verdadeira. Dizer que uma função era
inline sempre foi
apenas uma dica para o compilador, não algo que ele fosse obrigado a seguir.
Hoje em dia, a maioria dos compiladores conta com otimizadores de código, que podem decidir pela expansão
inline da chamada de função automaticamente -- e frequentemente com critério melhor do que o do programador que declararia a função como
inline .
Contudo, o principal benefício do
inline hoje em dia tem pouco a ver com isso que vai acima. A mais importante razão para usar
inline é informar ao linker que a mesma função pode ser definida múltiplas vezes em unidades de compilação diferentes, e que isso não deve ser encarado como erro de violação da regra de que cada função só pode ser definida uma vez (
one definition rule , ou ODR; e o linker só vai deixar de reclamar se todas as definições forem rigorosamente equivalentes).
Isso é especialmente importante por causa de programação genérica (uso de templates), e mais ainda quando esses você cria uma especialização de função genérica.
Particularmente, eu acho ruim esse sentido múltiplo dado à palavra-chave
inline (sugerir expansão de código
in loco × evitar violações da ODR). Entretanto, esse tipo de reutilização existe para outras palavras-chaves também (como com
static ,
break e mesmo
int ).
Eis algumas referências, incluindo exemplos.
-
http://stackoverflow.com/questions/1759300/when-should-i-write-the-keyword-inline-for-a-function-met...
-
http://stackoverflow.com/questions/10535667/does-it-make-any-sense-to-use-inline-keyword-with-templa...