Pergunta

Eu entendo que você pode usar a palavra-chave inline ou apenas colocar um método em uma declaração de classe ala short ctor ou um método getter, mas o compilador tomar a decisão final sobre quando inline meus métodos?

Por exemplo:

inline void Foo::vLongBar()
{
   //several function calls and lines of code
}

Será que o compilador ignorar a minha declaração em linha, se ele pensa que vai fazer o meu código ineficiente?

Como uma questão de lado, se eu tiver um método getter declarada fora da minha classe como este:

void Foo::bar() { std::cout << "baz"; }

Will o compilador em linha esta debaixo das cobertas?

Foi útil?

Solução

Seja ou não uma fiunction está embutido é, no final do dia, inteiramente até o compilador. Tipicamente, a função de uma forma mais complexa é, em termos de fluxo, menor a probabilidade do compilador é inline. e algumas funções, tais como aqueles recursiva, simplesmente não pode ser embutido.

A principal razão para não inlining uma função é que ele iria aumentar consideravelmente o tamanho total do código, evitando IOT de ser realizada no cache do processador. Isso seria de fato um pessimisation, ao invés de uma otimização.

Como a deixar o programador decidir atirar no próprio pé, ou em outro lugar, você pode inline função de si mesmo -. Escrever o código que teria ido na função em que teria sido site de chamada da função

Outras dicas

Sim, a decisão final sobre se ou não para inline suas mentiras código no compilador C ++. A palavra-chave inline é uma sugestão, não uma exigência.

Aqui estão alguns detalhes sobre a forma como esta decisão é processada no C ++ Compiler Microsoft

Como muitos já publicado, a decisão final é sempre até o compilador, mesmo se você pode dar dicas firmes como forceinline.
Parte da lógica é que inlining não é um interruptor automático "ir mais rápido". Demasiada inlining pode tornar seu código muito maior, e pode interferir com outras otimizações. Consulte O C ++ FAQ Lite sobre funções inline e desempenho .

Como outros já mencionado, a palavra-chave inline é apenas uma sugestão para o compilador para inline o código. Desde o compilador de código rotineiramente em linha que não foi marcado com inline, e não código embutido que tem, a palavra-chave parece tão redundante como register ou (pré-C ++ 0x) auto.

No entanto, há uma outra coisa que os efeitos inline-chave: Muda o Elevador da função de externo (o padrão para funções) para em linha . ligação em linha permite que cada unidade de compilação para conter a sua própria cópia do código objeto, e tem as vinculador remove redundantes cópias do executável final. Se que você lembra de templates, sim, modelos também usam ligação em linha.

Sim, o compilador tem a decisão final. Em VS você pode até mesmo funções em linha recursiva em profundidade especificada ;)

#pragma inline_depth( [0... 255] )

Só para acrescentar a minha 5 centavos ...

Eu encontrei este Guru do artigo Week sobre inlining muito útil.

Tanto quanto eu lembro que eu li em algum lugar que mesmo um ligador pode fazer inlining, quando se liga os arquivos de objetos e descobre que o código a ser ligados pode ser embutido.

Saudações,
Ovanes

Como uma questão de lado, se eu tiver um método getter declarada fora da minha classe como este:

void Foo::bar() { std::cout << "baz"; }

Será que o compilador em linha esta debaixo das cobertas?

Depende. Ele pode, por todos os chamadores na mesma unidade de tradução (o arquivo .cpp e todas as suas definições #included). Mas ele ainda tem para compilar uma versão não-inline porque pode haver chamadores de que a função fora da unidade de tradução. Você pode potencialmente ver isso no trabalho (se o seu compilador realmente pode fazê-lo) em níveis elevados de otimização. (Em particular: comparar o que acontece quando você #include todos os seus arquivos .cpp em um .cpp vs. o layout típico com todas as definições em uma unidade de tradução as oportunidades para tal aumento inlining dramaticamente..)

De acordo com o meu conhecimento, compilador irá automaticamente fazer uma função que declarou inline (ou escreveu dentro de uma declaração de classe) não -inline se encontrar um loop como for, while etc. Este é um exemplo onde compilador tem a última palavra em funções inline.

Se você realmente, positivamente, absolutamente, sem falhar NECESSIDADE para inline o código, há sempre a macro. C tem apoiado estes anos e porque são de substituição de texto pouco antes da compilação, que realmente, verdadeiramente, inline tudo o que você escreve.

É por isso que o 'inline' palavra-chave (e até mesmo, em alguns casos, as variantes forçados) podem dar ao luxo de não ter uma forma padrão de forçá-lo -. Você pode sempre escrever uma macro

Dito isto, a palavra-chave inline é muitas vezes melhor, porque o compilador, muitas vezes sabe se tornando uma função inline faz sentido ou não, e porque a linha pode interagir com o resto das otimizações do compilador.

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