Funções embutidas em c ++

Funções embutidas em c ++
Quando uma função normal é chamada em C ++, alguns são ouvidos apenas por chamar a função. Na verdade, chamar uma função leva tempo antes que a função realmente comece a executar. Desta vez, entre quando a função é chamada e quando a função realmente começa a executar é chamada de tempo de troca. Se a função normal for grande, o que significa que levará muito tempo para executar, o tempo de troca é relativamente pequeno e o usuário pode ignorá -lo. No entanto, se a função normal for pequena, como muitas funções são, o tempo de comutação, aproximadamente o mesmo para grandes e pequenas funções, não deve ser ignorado. Em muitas situações, o tempo de troca é mais longo do que o tempo que a pequena função leva para realmente executar; Em alguns casos, muito mais tempo.

Para resolver esse problema, o C ++ usa macro e a função embutida. Uma macro é como uma pequena função, mas geralmente é mais curta que uma pequena função típica. A macro mais longa ainda é uma "declaração". Um corpo de função pode ter mais de uma declaração. Uma pequena função em linha tem vantagens sobre uma pequena função normal.

Quando uma macro é definida, ela é chamada posteriormente no programa. Uma função embutida também é definida e depois chamada posteriormente no programa. Uma função normal é definida e depois chamada posteriormente no programa. Todos esses três tipos são definidos e chamados posteriormente no programa. Qualquer um deles pode ser chamado mais de uma vez.

As funções macro e pequenas em linha são diferentes da função de abordagem normal quando estão posteriormente no programa. O compilador C ++ coloca o código macro definido ou o pequeno código de função em linha (corpo) definido onde quer que seja chamado no programa. Quando o compilador faz isso, diz -se que o compilador expandiu a macro ou a função embutida. Este não é o caso de uma função normal. A função normal não é expandida, onde é chamado.

Embora a chamada de uma função normal precise de tempo de troca, para que a função seja adequadamente afirmada antes de sua execução, a macro ou a pequena função em linha começa a execução sempre que é chamada, e não há desperdício de tempo de troca. Essa é a principal vantagem que a macro e a pequena função embutida têm sobre a função normal, i.e., O tempo de troca é omitido.

Este artigo explica as funções embutidas em C ++ em comparação com as macros. Uma explicação da macro é dada. Uma comparação da função embutida e a função normal é feita no final do artigo.

Nota: Diz -se que ligar para uma macro em um programa está invocando a macro.

Conteúdo do artigo

  • Introdução - Veja acima
  • Definindo macros e funções embutidas
  • função embutida e o compilador
  • Comparando macros e funções embutidas
  • Comparando funções embutidas e normais
  • Conclusão

Definindo macros e funções embutidas

Macro semelhante a objetos e variável embutida
Há uma macro semelhante a um objeto, e há uma macro do tipo função. Correspondentemente, existem variáveis ​​em linha e funções em linha. Considere o seguinte programa C ++:

#incluir
usando namespace std;
#Define var1 "e"
Char var2 em linha = 'e';
int main ()

cout << var1 << endl;
cout << var2 << endl;
retornar 0;

A saída é:

E
E

Este programa possui uma macro semelhante a objetos e uma variável embutida. Cada um detém o valor, 'e'. Uma macro semelhante a objetos começa com #define e não tem indicador de tipo. Uma variável em linha começa com "embutida", e um indicador de tipo segue. As macros têm uma desvantagem em comparação com os tipos de embutimento porque não indicam o tipo. Isso pode levar a problemas de incompatibilidade de tipo no programa. Na função main (), var1 e var2 são o código de definição das diferentes variáveis, respectivamente.

NOTA: Não está claro se o VAR1 segura um char ou uma corda literal. Além disso, observe que uma macro, semelhante a objetos ou de função, não termina com um semicolon. Termina pressionando a tecla Enter. Uma variável embutida ou função embutida termina de maneira normal.

Macro e função embutida do tipo função
Uma macro semelhante à função é uma macro que leva argumentos. Como a macro semelhante a objetos, onde quer que a macro do tipo função seja invocada no programa, o compilador substitui a invocação pela definição de código e elimina o tempo de comutação (sobrecarga de chamada de função) no tempo de execução.

Uma função embutida é uma função que começa com "embutido". Tem uma vantagem sobre a macro do tipo função com seu tipo de retorno e tipos de argumento. Uma macro semelhante à função não tem tipos de argumento ou tipos de retorno. Seu tipo de retorno é o valor final do nome da macro.

O programa C ++ a seguir possui uma macro do tipo função e uma função embutida, cada um dos quais procura o valor máximo de dois argumentos. A função embutida compara dois números inteiros e retorna o número inteiro maior. O valor de retorno da função em linha pode ser atribuído a uma nova variável int. Por outro lado, o valor final da macro se torna o valor da macro.

#incluir
usando namespace std;
#define maxm (a, b) ((a)> (b) ? (a): (b))
Inline int maxi (int a, int b)
se (a> b)
retornar a;
se um < b)
retornar b;
se (a == b)
retornar a;

int main ()

cout << maxM(2.5, 6) << endl;
cout << maxI(3, 7) << endl;
retornar 0;

A saída é:

6
7

Com a macro, os argumentos devem ser de tipos compatíveis. Isso dá ao macro uma espécie de vantagem sobre a função embutida, cujos tipos de argumento devem ser os mesmos, neste caso.

O nome da macro é maxm. Os argumentos são A e B. O resto é um tipo de corpo de função, delimitado por parênteses. Ele diz que se (a)> (b) for verdadeiro, a se torna o valor da macro; Caso contrário, B se torna o valor da macro.

função embutida e o compilador

Depois que o compilador substitui a chamada de função embutida com o código de definição da função, o programa ainda precisa executar. A compilação não está executando ou executando o programa. Com a função normal, a sobrecarga (tempo de comutação) ocorre quando o programa é executado (executado). A substituição macro ou embutida ocorre durante a compilação, que é antes da execução (antes que o programa seja enviado ao cliente ou usuário).

No final, o tempo de comutação é omitido ou obtido para macros e pequenas funções em linha. No entanto, se a função embutida for grande, o compilador decidirá se deve fazer a função declarada como embutida, embutida ou não. Se a função declarada como embutida for grande, pode não haver ganho significativo em substituir qualquer uma de suas chamadas pelo corpo de seu código de função. Quanto aos critérios da decisão do compilador, - veja mais tarde.

Nota: Uma função definida em uma definição de classe é uma função embutida precedida pelo especificador embutido.

Comparando macros e funções embutidas

A macro pode funcionar com diferentes tipos, desde que sejam compatíveis. Esta é uma vantagem. No entanto, isso também leva a efeitos colaterais, o que então dá uma desvantagem. A função embutida testará a validade de seus tipos de argumento antes de usar os argumentos, o que evita efeitos colaterais.

Comparando funções embutidas e normais

Vantagens da função embutida

  • Não há sobrecarga de chamada de função (sem tempo de troca).
  • Também há despesas gerais quando uma função normal retorna. Com a função embutida, não há sobrecarga de chamada de retorno.
  • Existe uma possível otimização específica do contexto do corpo da função com a função embutida.

Desvantagens da função embutida

  • Para cada chamada da função embutida, o código da definição de função (corpo) é repetido (foi retipado pelo compilador). Isso pode levar a um arquivo binário muito grande (compilado).
  • O compilador leva muito tempo para compilar, pois repete o mesmo código para todas as chamadas.

Funções embutidas podem não ser necessárias para muitos sistemas incorporados, porque um tamanho menor do programa é preferível a uma velocidade mais alta.

Existem outras desvantagens - veja mais tarde.

Conclusão

A função embutida é como uma macro. Eles servem ao mesmo propósito. O código de definição substitui cada chamada de invocação ou função. No entanto, uma função embutida tem mais vantagens sobre a macro. Existe a macro semelhante a objetos e, correspondentemente, a variável embutida. Existe a macro do tipo função, e existe correspondência a função embutida. Uma função definida em uma definição de classe é uma função em linha, seja o especificador embutido precede ou não.

Para definir uma macro semelhante a um objeto ou uma macro do tipo função, precede-a com #Define seguida pelo nome da macro. A macro não especifica seu tipo de valor ou tipos de argumento. Para definir uma variável embutida ou uma função embutida, precede -a com o especificador, embutido, seguido pelo tipo de retorno e depois o nome. Para a função embutida, tanto o tipo de retorno quanto os tipos de argumento são precisos. Efeitos colaterais são evitados.

A função embutida tem vantagens gerais sobre a macro. Existem prós e contras quando a função embutida é comparada à função normal.