Ir para conteúdo
Fórum Script Brasil
  • 0

Funções


Bolt 4

Pergunta

E aí gente beleza?

Olha só,a questão é que estou fazendo uma aula de C++ para um grupo de estudos,e queria saber se alguém pode me explicar,exatamente ou me indicar algum tuto que explique sobre funções,o básico já fiz.

Mas minha pergunta mais urgente é:

O que é função inline?Podem me ajudar,estou aqui por que procurei muito e não consegui entender,sei que é muito boa em programas pequenos,por que dá velocidade.Um exemplo também ia ser ótimo.Obrigado.

Obs.Tenho que entregar amanhã,poderia ser hoje?

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Basicamente, inline é um modificador para otimizar o codigo. Ele funciona da seguinte forma: Para funcoes pequenas, ele ira pegar o corpo da funcao e colocar diretamente no lugar onde ela seria chamada. Para funcoes grandes, depende do compilador. alguns vao ignorar o inline, outros vao coloca-lo mesmo assim.

Um exemplo:

inline void incrementa(int &i){
       i++;
}

int main(){
     int i;
     incrementa(i);
     return 0;
Depois de compilado, o codigo ficara como se tivesse sido escrito da seguinte forma:
int main(){
     int i;
     i++;
     return 0;
}

Na verdade, tem algumas diferencas pois ele deve abrir bloco e fazer algumas outras coisas para que funcione, mas a ideia é essa. Mais uma coisa: Se em algum lugar do codigo voce usar uma funcao inline como ponteiro de funcao, dependo do compilador ele pode descosiderar que ela é inline e usa-la como funcao normal.

Se quiser mais informacoes sobre modificadores, de uma olhada nesse tutorial http://vidageek.net/2007/02/16/dia-c-modif...extensoes-gnuc/

Link para o comentário
Compartilhar em outros sites

  • 0

Então ele funciona em um programa com duas ou mais funções,em que ele inicializa na pirimeira? tentei fazer com apenas uma não deu certo,daí fiço com duas e funcionou legal.Ele serve apenas para acelerar os programas?

Link para o comentário
Compartilhar em outros sites

  • 0

Ele funciona em um programa com qualquer numero de funcoes, mas voce precisa habilitar as opcoes de otimizacao do compilador (no caso do gcc/gpp/g++ -oN, sendo N 1, 2, 3, 4, 5 ou 6). A funcao dele é apenas acelerar o programa mesmo.

Link para o comentário
Compartilhar em outros sites

  • 0

você sabe como posso fazer essa optimização no Codeblocks ou no Dev,para implementar na aula.

Me parece que ela dá erro quando é implementada junto com a função main.

Uso o Codebloks,mas a maioria usa o Dev,obrigado por enquanto.

Editado por Bolt 4
Link para o comentário
Compartilhar em outros sites

  • 0

O Codeblocks é padrão ANSI? porque o inline faz parte da definicao desse padrão, embora varios outros compiladores tambem implementem. O ideal é voce olhar o manual do seu compilador e la voce ve as flags de otimizacao dele (acredito que todo compilador de C++ possua flags de otimizacao). Alguns voce nem precisa ativar, já vem ativas por padrão. Se voce quiser saber se ele esta fazendo o inlining das funcoes, use a ideia daquele exemplo que eu coloquei no post #2, mas faca um loop para ele usar a funcao de incremento umas 1000000 vezes. Com esse numero de incrementos, a diferenca entre uma funcao inline e uma não inline é bem visivel.

Link para o comentário
Compartilhar em outros sites

  • 0

#include <iostream>
using namespace std;
 inline int main()
{
    int a,b;
    a=3;
    b=6;
    cout<<"a soma e  "<<a+b<<"\n\n";
    system("pause");
    return 0;
}
Dessa maneira com apenas uma função dá erro na abertura do bloco( { ) . E dessa maneira compila muito bem.
#include <iostream>
using namespace std;
inline int rato(int a,int b)
{
    cout<<"a soma e  "<<a+b<<"\n\n";
    system("pause");
    return 0;
}
int main()
{
    rato(3,5);
    system("pause");
    return 0;
}
Por isso que pensei que o problema era usa-lo junto ao main e então precisaria de duas funções,mas você disse que pode ser com qualquer número de funções.O primeiro exemplo está certo? Fiço o que me sugeriu ,inseri o loop for:
#include <iostream>
using namespace std;
inline int rato(int a)
{
   for(a=1;a<=100000;a++)
    cout<<"        "<<a;
    system("pause");
    return 0;
}
int main()
{
    rato(100);
    system("pause");
    return 0;
}

Mas não vi diferença na velocidade,a não ser que seja pouca,assim não conseguiria ver mesmo,os números ficam rápidos,das duas maneiras,até coloquei um espaço entre os números para melhor visualizá-los.No tempo de execução também não ouve diferença,será que estou fazendo errado ?

Editado por Bolt 4
Link para o comentário
Compartilhar em outros sites

  • 0

então, acho que não expliquei direito. Main não pode ser inline por que a funcao que voce declara como main sera chamada por um inicializador (geralmente escrito em assebly), portanto ela não tem como ser inserida no meio daquele codigo. Em teoria, qualquer outra funcao pode ser inline, mas ai dependendo do tamanho dela cai no problema que eu citei no post #2. Minha ideia para voce veriicar a velocidade que o inline acrescenta era algo assim:

inline void incrementa(int &i){/*não programo muito em C++, mas acho que passagem por referencia é assim*/
    i++;
}

int main(){
     int i;
     for (i = 0; i < 10000000; ){
           incrementa(i);
     }
     return 0;
}
Dai voce testa com o inline e sem o inline pra notar a diferenca. Um que tenho certeza que a diferenca ficara visivel (a não ser que o compilador já otimize) é:
inline int incrementa(int i){
      return i+1;
}

int main(){
     int i;
     for (i = 0; i < 10000000; )
          i = incrementa(i);
     return 0;
}

Link para o comentário
Compartilhar em outros sites

  • 0

Jonas,agora entendi sobre o main.

Sobre seu programa tive que colocar um cout<<,pois não estava funcionando,mas a velocidade é a mesma,talvez o compilador seja otimizado,como você relatou.

Meu compilador de C++ Codebleoks download

Se puder use-o,e me diz. Se não, também tá beleza.

Seu código com o cout ficou assim o segundo exemplo,mas também fiço com o primeiro,tava dando o mesmo problema,ou fazia parte?

#include <iostream>
using namespace std;
  int incrementa(int i){
     cout<<i;// aqui.
      return i+1;
}

int main(){
     int i;
     for (i = 0; i < 10000000; )
          i = incrementa(i);
     return 0;
}

Usei com e sem inline como me disse.

Editado por Bolt 4
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...