Pergunta

Existe alguma diferença para o seguinte código:

class Foo  
{
  inline int SomeFunc() { return 42; }
  int AnotherFunc() { return 42; }
};

Will tanto funções fica embutido? Será em linha realmente fazer alguma diferença? Existem regras sobre quando você deve ou não código embutido? Costumo usar a sintaxe AnotherFunc (acessores por exemplo), mas eu raramente especificar inline diretamente.

Foi útil?

Solução

Ambos os formulários devem ser embutido na exata mesma maneira. Inline está implícita para corpos função definida em uma definição de classe.

Outras dicas

A palavra-chave inline é essencialmente uma dica para o compilador. Usando inline não garante que a sua função irá ser embutido, nem omiti-lo garantir que ele não vai . Você está apenas deixando o know compilador que pode ser uma boa idéia para tentar mais difícil para inline essa função específica.

Guru da Semana # 33 respostas de Sutter algumas de suas perguntas e muito mais.

http://www.gotw.ca/gotw/033.htm

class Foo  
{
  inline int SomeFunc() { return 42; }
  int AnotherFunc() { return 42; }
};

É certo que ambas as formas são garantidos para compilar o mesmo. No entanto, é preferível fazer nenhuma dessas maneiras. De acordo com a a ++ FAQ C você deve declarar normalmente dentro da definição de classe, e em seguida, defini-lo fora da definição de classe, dentro do cabeçalho, com a explícita em linha palavra-chave. Como o FAQ descreve, isso é porque você quer separar a declaração e definição para a legibilidade dos outros (declaração é equivalente a "o que" e definição "como").

A linha realmente fazer alguma diferença?

Sim, se o compilador concede o pedido em linha, é muito diferente. Pense em código embutido como uma macro. Em todos os lugares é chamado, a chamada de função é substituído pelo código real na definição da função. Isso pode resultar em inchaço código se em linha grandes funções, mas o compilador normalmente protege contra isso por não conceder um pedido de linha se a função é muito grande.

Existem regras sobre quando você deve ou não código embutido?

Eu não sei de nenhum rápida regras duras +, mas uma orientação é para código só linha se ele é chamado muitas vezes e é relativamente pequeno. Setters e getters são comumente embutido. Se ele está em uma área do código especialmente desempenho intensivo, inlining deve ser considerada. Lembre-se sempre que você está negociando a velocidade de execução para o tamanho do executável com inlining.

suportes VC ++ __forceinline e __ declspec (noinline) directivas, se você acha que sabe melhor que o compilador. Dica: você provavelmente não

in-line é uma sugestão compilador e não força o compilador para inline o código (pelo menos em C ++). Portanto, a resposta curta é que compilador e dependente o que vai acontecer no seu exemplo provavelmente contexto. A maioria dos bons compiladores seria provavelmente em linha tanto especialmente devido à otimização óbvia de um retorno constante de ambas as funções.

Em linha geral, não é algo que você deve se preocupar. Traz a vantagem de não ter de executar instruções máquina para gerar um quadro de pilha e retornar o fluxo de controlo de funcionamento. Mas em todos, mas os casos mais especializados eu diria que é trivial.

Inline é importante em dois casos. Um se você estiver em um ambiente em tempo real e não responder rápido o suficiente. Dois é se perfis de código mostrou um gargalo significativo em um loop muito apertado (ou seja, uma sub-rotina chamada mais e mais), em seguida, inlining poderia ajudar.

As aplicações específicas e arquiteturas também podem levar você a inlining como uma otimização.

Eu encontrei alguns compiladores C ++ (ou seja SunStudio) queixam-se a linha for omitida, como em

int AnotherFunc() { return 42; }

Então, eu recomendo sempre usando a palavra-chave inline neste caso. E não se esqueça de remover a palavra-chave inline se você mais tarde implementar o método como uma chamada de função real, isso vai realmente atrapalhar a vinculação (em SunStudio 11 e 12 e Borland C ++ Builder). Eu sugeriria fazer uso mínimo de código embutido porque quando percorrendo o código com um depurador, ele irá 'passo para' o código embutido mesmo quando se usa 'step over' comando, isso pode ser bastante irritante.

Note que fora de uma classe, inline faz algo mais útil no código: forçando (bem, mais ou menos) o compilador C ++ para gerar o código embutido em cada chamada para a função, impede múltiplas definições do mesmo símbolo (a assinatura de função) em diferentes unidades de tradução.

Então, se você uma função inline terceiro em um arquivo de cabeçalho, e que incluem em vários arquivos CPP você não tem o ligador gritando com você. Se a função é muito grande para você sugerir inline-ing, fazê-lo o caminho C: declare no cabeçalho, definir no CPP

.

Isto tem pouco a ver com o fato de que o código é realmente inlined:. Permite que o estilo de implementação no cabeçalho, como é comum para funções de membro curtas

(imagino o compilador será inteligente se ele precisa de uma prestação não-inline da função, como é para funções de modelo, mas ...)

Também a acrescentar ao que Greg disse, quando preforming optimization (ie inline-ing) as consultas compilador não só as palavras-chave no código, mas também argumentos outra linha de comando a especificar como o compilador deve otimizar o código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top