INLINE C++ [RESOLVIDO]

1. INLINE C++ [RESOLVIDO]

Nokhy Plemun
Nokhy

(usa Linux Mint)

Enviado em 29/03/2016 - 13:37h

Por padrão um método declarado(programado) dentro de uma class em c++, e definido com inline.
Ex:

class tal
{
void funcao()
{
// Comandos
}
};

Quero saber se e possível declarar(programar) esse método dentro da classe sem que seja inline, sei que e possível declarar(protótipo) ele dentro da class e programa fora usando Class::Funcao.


  


2. MELHOR RESPOSTA

Paulo
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...

3. Re: INLINE C++ [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/03/2016 - 17:41h

É mais ou menos isto, se não me engano.

E existe uma comparação entre os inlines e as macros declaradas com #define.
Sobre qual é melhor ou pior.

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



4. Resolvido

Nokhy Plemun
Nokhy

(usa Linux Mint)

Enviado em 29/03/2016 - 17:54h

paulo1205 escreveu:

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

Agradeço.
Depois de ler tanto pdf, acredito que essa foi a melhor explicação!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts