Pergunta
Sei que o compilador pode ou não executar a expansão embutida de uma função, seja solicitada pelo programador ou não.
Fiquei curioso para saber: existe alguma maneira pela qual o programador pode saber com certeza que o compilador inlinou uma função específica?
Solução
Além de olhar para o código gerado, não. Algumas implementações podem fornecer essas informações, mas não são exigidas pelo padrão.
Coisas como inline
ou register
(estremece) são sugestões Para o compilador e é livre aceitá-los, ignorá-los ou até mentir para você que é feito enquanto está secretamente pelas suas costas e não faz isso :-)
Costumo não usar recursos como esse, já que suspeito que o compilador geralmente saiba melhor do que o mais apresenta o desempenho do meu código.
Outras dicas
Você pode perfilar seu código e ver se a função do interesse aparece na pilha de chamadas. Embora, suponho que não haja garantia se sua taxa de amostragem de pilha não for alta o suficiente.
Mas pode provar que está inlinhado: se você sabe A
chamadas B
, que chama C
, e A
nunca liga C
diretamente, se você vir A
chamando C
Na pilha de chamadas, você sabe B
foi inlinhado para essa ligação.
Defina seu compilador para gerar código de montagem e verifique lá.
Leia a desmontagem do arquivo de objeto.
Não há como saber, exceto olhar para o montador de saída.
Hoje em dia, os compiladores são "inteligentes" e decidem quais funções inline e em que casos.
Assim como a palavra -chave Register, os compiladores escolhem hoje em dia e realmente ignoram suas solicitações.
Eu não acho que existe uma maneira de descobrir o que você quer,
Mas você pode aumentar as possibilidades da função sendo uma função embutida por,
Tornando a definição da função visível para a unidade de tradução na qual é chamada. ou seja, você sempre precisa colocar a definição de uma função embutida no arquivo de cabeçalho.