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?

Foi útil?

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.

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