Compartilhar via


inline, embutido, __forceinline

O inline e __inline especificadores de instruem o compilador para inserir uma cópia do corpo da função em cada local em que a função é chamada.

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

Comentários

A inserção (chamado de expansão in-line ou inlining) ocorre somente se a análise de custo/benefício do compilador mostrá-la para ser lucrativo.Expansão in-line diminui a chamada de função sobrecarga ao custo potencial do maior tamanho de código.

O __forceinline palavra-chave substitui a análise de custo/benefício e se baseia no discernimento do programador em vez disso.Cuidado ao usar __forceinline.Uso indiscriminado de __forceinline pode resultar em maior código com apenas os ganhos de desempenho marginal ou, em alguns casos, até mesmo as perdas de desempenho (devido à maior paginação de um executável maior, por exemplo).

Usando funções embutidas pode tornar seu programa mais rapidamente pois elas eliminam a sobrecarga associada a chamadas de função.Inline expandido de funções estão sujeitas a otimizações do código não está disponíveis para as funções normais.

O compilador trata as opções de expansão entre linhas e palavras-chave como sugestões.Não há nenhuma garantia de que funções será embutidas.Você não pode forçar o compilador embutido uma determinada função, mesmo com o __forceinline palavra-chave.Durante a compilação com /clr, o compilador irá in-line não uma função se existem atributos de segurança aplicados à função.

O in-line palavra-chave está disponível somente em C++.O __inline e __forceinline as palavras-chave estão disponíveis em c e C++.Para compatibilidade com versões anteriores, _inline é um sinônimo de __inline.

O in-line palavra-chave, que informa o compilador que expansão embutido é preferencial.No entanto, o compilador pode criar uma instância separada da função (instanciar) e criar vínculos de chamada padrão em vez de inserir o código interno.Dois casos em que isso pode acontecer são:

  • Funções recursivas.

  • Funções que são conhecidas através de um ponteiro em outro lugar na unidade de conversão.

Essas razões podem interferir inlining, como talvez outras pessoas, a critério do compilador; Você não deve depender do in-line especificador para fazer com que uma função a ser embutido.

Assim como acontece com funções normais, não há uma ordem definida de avaliação dos argumentos para uma função embutida.Na verdade, pode ser diferente da ordem na qual os argumentos são avaliados quando passado usando o protocolo de chamada de função normal.

O /Ob opção de compilador otimização ajuda a determinar se a expansão da função in-line realmente ocorre.

/ /LTCG executa o cross-module inlining independentemente de ele foi solicitado no código-fonte.

Exemplo 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

Funções de membro de classe podem ser declaradas embutidos usando o in-line palavra-chave ou colocando-se a definição da função dentro da definição de classe.

Exemplo 2

// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;

class MyClass {
public:
   void print() { cout << i << ' '; }   // Implicitly inline
private:
   int i;
};

Específicos do Microsoft

O __inline palavra-chave é equivalente a in-line.

Mesmo com __forceinline, o compilador não é o código embutido em todas as circunstâncias.O compilador embutido uma função não é possível se:

  • A função ou seu chamador é compilado com o /Ob0. (baseia-se a opção padrão para depuração).

  • A função e o chamador usam diferentes tipos de (manipulação de exceção de C++ em um, no outro de manipulação de exceção estruturada) de manipulação de exceção.

  • A função tem uma lista de argumentos variável.

  • A função usa o assembly embutido, a menos que compilado com /Og, /Ox, /O1 ou /O2..

  • A função é recursiva e não são acompanhados por # pragma inline_recursion(on).Com o pragma, recursivas: funções são embutidas a uma profundidade de padrão de 16 chamadas.Para reduzir a profundidade inlining, use inline_depth pragma.

  • A função é virtual e é chamada virtualmente.Chamadas diretas para funções virtuais podem ser embutidas.

  • O programa usa o endereço da função e a chamada é feita via o ponteiro para a função.Chamadas diretas para funções que tiveram seus endereços obtidos podem ser embutidas.

  • A função também é marcada com o nua__declspec modificador. 

Se o compilador não pode embutida uma função declarada com __forceinline, ele gera um aviso de nível 1.

Recursivas: funções podem ser substituída in-line a uma profundidade especificada pelo inline_depth pragma, um máximo de 16 chamadas.Após essa profundidade, chamadas de função recursiva são tratadas como chamadas para uma instância da função.A profundidade para qual recursiva funções são examinadas pelo heurístico embutido não pode exceder 16.O inline_recursion pragma controla a expansão embutida de uma função atualmente em expansão.Consulte o Expansão da função embutida (/ Ob) a opção de compilador para obter informações relacionadas.

Específicos do Microsoft final

Para obter mais informações sobre como usar o in-line especificador, consulte:

Consulte também

Referência

Palavras-chave C++

noinline

auto_inline