Quais são as vantagens / desvantagens do uso de funções embutidas no C ++? Vejo que apenas aumenta o desempenho do código que o compilador gera, mas com os compiladores otimizados de hoje, CPUs rápidas, memória enorme etc. (não como nos anos 1980 <onde a memória era escassa e tudo tinha que caber em 100 KB de memória) o que vantagens que eles realmente têm hoje?
c++
inline-functions
Lennie De Villiers
fonte
fonte
inline
seja uma palavra-chave c ++ e que inlining seja uma técnica de otimização de compilador. Veja esta pergunta " quando devo escrever a palavra-chaveinline
para uma função / método " para obter a resposta correta.Respostas:
As funções embutidas são mais rápidas porque você não precisa ativar / desativar as coisas na pilha, como parâmetros e endereço de retorno; no entanto, ele torna seu binário um pouco maior.
Isso faz uma diferença significativa? Não é notavelmente suficiente no hardware moderno para a maioria. Mas pode fazer a diferença, o que é suficiente para algumas pessoas.
Marcar algo como inline não garante que ele seja inline. É apenas uma sugestão para o compilador. Às vezes, não é possível, como quando você tem uma função virtual ou quando há recursão envolvida. E, às vezes, o compilador escolhe não usá-lo.
Pude ver uma situação como essa fazendo uma diferença detectável:
fonte
Vantagens
Desvantagens
Magia embutida
return 42 ;
instrução. Isto é para mim inlining extremo . Isso acontece raramente na vida real, aumenta o tempo de compilação, não incha o seu código e o torna mais rápido. Mas, como o graal, não tente aplicá-lo em qualquer lugar, porque a maioria dos processos não pode ser resolvida dessa maneira ... Ainda assim, isso é legal ...:-p
fonte
3.2/6: There can be more than one definition of [..] inline function with external linkage [..] non-static function template
. Em 5.1.5 / 6For a generic lambda, the closure type has a public inline function call operator member template
. E7.1.2/2: the use of inline keyword is to declare an inline function
onde é uma sugestão alinhar o corpo da função no ponto de chamada. Assim, concluo que, mesmo se eles podem se comportar as mesmas funções, inline e modelos de função são ainda, noções separadas ortogonais que podem ser misturados (ou seja, em linha modelo de função)No arcaico C e C ++,
inline
é comoregister
: uma sugestão (nada mais que uma sugestão) para o compilador sobre uma possível otimização.No C ++ moderno,
inline
informa ao vinculador que, se várias definições (não declarações) forem encontradas em diferentes unidades de conversão, elas serão iguais e o vinculador poderá manter uma livremente e descartar todas as outras.inline
é obrigatório se uma função (não importa quão complexa ou "linear") for definida em um arquivo de cabeçalho, para permitir que várias fontes a incluam sem obter um erro de "definição múltipla" pelo vinculador.As funções de membro definidas dentro de uma classe são "inline" por padrão, assim como as funções de modelo (em contraste com as funções globais).
Observe a inclusão de fileA.h em dois arquivos .cpp, resultando em duas instâncias de
afunc()
. O vinculador descartará um deles. Se nãoinline
for especificado, o vinculador irá reclamar.fonte
Inlining é uma sugestão para o compilador que é livre para ignorar. É ideal para pequenos pedaços de código.
Se sua função está embutida, ela é basicamente inserida no código em que a chamada de função é feita, em vez de realmente chamar uma função separada. Isso pode ajudar na velocidade, pois você não precisa fazer a chamada real.
Ele também auxilia as CPUs no pipelining, pois elas não precisam recarregar o pipeline com novas instruções causadas por uma chamada.
A única desvantagem é o aumento do tamanho binário, mas, desde que as funções sejam pequenas, isso não importará muito.
Eu costumo deixar esse tipo de decisão para os compiladores hoje em dia (bem, os inteligentes de qualquer maneira). As pessoas que os escreveram tendem a ter um conhecimento muito mais detalhado das arquiteturas subjacentes.
fonte
A função embutida é a técnica de otimização usada pelos compiladores. Pode-se simplesmente acrescentar palavra-chave inline ao protótipo de função para tornar uma função inline. A função embutida instrui o compilador a inserir o corpo completo da função sempre que essa função foi usada no código.
Vantagens: -
Não requer sobrecarga de chamada de função.
Ele também economiza sobrecarga de variáveis push / pop na pilha, enquanto chama funções.
Ele também economiza a sobrecarga da chamada de retorno de uma função.
Aumenta a localidade de referência utilizando o cache de instruções.
Após o alinhamento, o compilador também pode aplicar a otimização intra-processual, se especificado. Este é o mais importante, desta maneira o compilador agora pode se concentrar na eliminação de código morto, pode dar mais ênfase à previsão de ramificação, eliminação de variável de indução etc.
Para saber mais, pode-se seguir este link http://tajendrasengar.blogspot.com/2010/03/what-is-inline-function-in-cc.html
fonte
Eu gostaria de acrescentar que as funções embutidas são cruciais quando você está criando uma biblioteca compartilhada. Sem a função de marcação embutida, ela será exportada para a biblioteca no formato binário. Ele também estará presente na tabela de símbolos, se exportado. Por outro lado, funções embutidas não são exportadas, nem para os binários da biblioteca nem para a tabela de símbolos.
Pode ser crítico quando a biblioteca se destina a ser carregada em tempo de execução. Também pode atingir bibliotecas compatíveis com binários. Nesses casos, não use inline.
fonte
inline
ao criar uma biblioteca compartilhada!Durante a otimização, muitos compiladores incorporarão funções embutidas, mesmo que você não as tenha marcado. Geralmente, você só precisa marcar as funções como inline se souber algo que o compilador não sabe, pois geralmente ele próprio pode tomar a decisão correta.
fonte
inline
permite colocar uma definição de função em um arquivo de cabeçalho e#include
esse arquivo de cabeçalho em vários arquivos de origem sem violar a regra de uma definição.fonte
De um modo geral, hoje em dia, com qualquer compilador moderno preocupado em incluir algo é uma perda de tempo. O compilador realmente deve otimizar todas essas considerações para você por meio de sua própria análise do código e sua especificação dos sinalizadores de otimização passados para o compilador. Se você se preocupa com a velocidade, diga ao compilador para otimizar a velocidade. Se você se preocupa com o espaço, diga ao compilador para otimizar o espaço. Como outra resposta mencionada, um compilador decente entrará automaticamente em linha automaticamente se realmente fizer sentido.
Além disso, como outros já declararam, o uso em linha não garante nada em linha. Se você quiser garantir, precisará definir uma macro em vez de uma função embutida para fazê-lo.
Quando alinhar e / ou definir uma macro para forçar a inclusão? - Somente quando você tiver um aumento comprovado e necessário na velocidade de uma seção crítica do código que afeta o desempenho geral do aplicativo.
fonte
Não se trata apenas de desempenho. O C ++ e o C são usados para programação incorporada, em cima do hardware. Por exemplo, se você escrever um manipulador de interrupções, precisará garantir que o código possa ser executado de uma só vez, sem que registros e / ou páginas de memória adicionais sejam trocadas. É quando o inline é útil. Bons compiladores fazem alguns "inline" quando a velocidade é necessária, mas "inline" os compele.
fonte
Caiu no mesmo problema com funções embutidas em tão bibliotecas. Parece que funções embutidas não são compiladas na biblioteca. como resultado, o vinculador lança um erro de "referência indefinida", se um executável deseja usar a função embutida da biblioteca. (aconteceu comigo compilando a fonte Qt com o gcc 4.5.
fonte
Por que não tornar todas as funções embutidas por padrão? Porque é uma troca de engenharia. Existem pelo menos dois tipos de "otimização": acelerar o programa e reduzir o tamanho (pegada de memória) do programa. Inlining geralmente acelera as coisas. Ele elimina a sobrecarga da chamada de função, evitando empurrar e puxar parâmetros da pilha. No entanto, também aumenta a área de memória do programa, porque agora todas as chamadas de funções devem ser substituídas pelo código completo da função. Para tornar as coisas ainda mais complicadas, lembre-se de que a CPU armazena pedaços de memória usados com freqüência em um cache na CPU para acesso ultra-rápido. Se você tornar a imagem de memória do programa grande o suficiente, seu programa não poderá usar o cache de maneira eficiente e, na pior das hipóteses, o inlining poderá reduzir a velocidade do programa.
fonte
Nosso professor de ciência da computação nos incentivou a nunca usar inline em um programa c ++. Quando perguntado por que, ele nos explicou que os compiladores modernos deveriam detectar quando usar o inline automaticamente.
Portanto, sim, o inline pode ser uma técnica de otimização a ser usada sempre que possível, mas aparentemente isso é algo que já é feito para você sempre que é possível incorporar uma função de qualquer maneira.
fonte
inline
no C ++ tem dois significados muito distintos - apenas um deles está relacionado à otimização, e seu professor está correto com relação a isso. No entanto, o segundo significado deinline
é frequentemente necessário para satisfazer a Regra de Uma Definição .Conclusão de outra discussão aqui:
Existem desvantagens com funções embutidas?
Aparentemente, não há nada de errado em usar funções embutidas.
Mas vale a pena notar os seguintes pontos!
O uso excessivo de inlining pode realmente tornar os programas mais lentos. Dependendo do tamanho de uma função, a inclusão de uma função pode aumentar ou diminuir o tamanho do código. A inclusão de uma função acessora muito pequena geralmente diminui o tamanho do código, enquanto a inclusão de uma função muito grande pode aumentar drasticamente o tamanho do código. Nos processadores modernos, códigos menores geralmente são executados mais rapidamente devido ao melhor uso do cache de instruções. - Diretrizes do Google
Os benefícios de velocidade das funções embutidas tendem a diminuir à medida que a função aumenta de tamanho. Em algum momento, a sobrecarga da chamada de função torna-se pequena em comparação com a execução do corpo da função e o benefício é perdido - Fonte
Existem poucas situações em que uma função embutida pode não funcionar:
A
__inline
palavra-chave faz com que uma função seja incorporada apenas se você especificar a opção de otimização. Se a opção otimizar for especificada, se é ou não__inline
respeitada depende da configuração da opção otimizador em linha. Por padrão, a opção embutida entra em vigor sempre que o otimizador é executado. Se você especificar otimizar, também deverá especificar a opção noinline se desejar que a__inline
palavra-chave seja ignorada. -Fontefonte
inline
palavra - chave para determinar se o código embutido deve ou não ser incorreto. Eles seriam verdadeiros se o compilador usasse a palavra-chave para embutir (é usada apenas para determinar a marcação de várias definições para fins de vinculação).