Funções inline em C++

Jinku Hu 12 outubro 2023
Funções inline em C++

Este artigo explicará como embutir uma função em C++.

O Conceito de Função Inlining

Funções são a base de muitas linguagens de programação. Os recursos comuns das funções são considerados conhecidos pelo leitor deste artigo, portanto, vamos nos concentrar nos detalhes de execução da função da perspectiva do desempenho da CPU e motivar a necessidade de inlining de função.

Nesse caso, vamos presumir que executamos nosso programa em um único núcleo de CPU. Geralmente, uma CPU busca instruções da memória e as executa em ordem. Observe que chamar uma função força a CPU a pular para um endereço não sequencial diferente, o que é caro. Além disso, algumas estruturas precisam ser configuradas durante a chamada de função, como um quadro de pilha. O ambiente de execução deve salvar e restaurar os registros de cada função, e algumas outras operações diversas são feitas, as quais afetam o desempenho do programa. Como resultado, é preferível que as chamadas de função desnecessárias sejam eliminadas.

A redução do tempo gasto em chamadas de função pode ser feita em diferentes níveis do programa; por exemplo, o compilador pode tentar otimizar o código de máquina gerado para eliminar chamadas de função desnecessárias ou o sistema operacional para implementar técnicas de chamada rápida. O programador pode ter uma visão única sobre o programa que pode ajudar a otimizar as chamadas de função.

O último geralmente é feito reduzindo o número de chamadas de função manualmente ou marcando a função como inline. A palavra-chave inline indica ao compilador que deve gerar o código de máquina para que o mecanismo de chamada de função regular seja ignorado. Alguns compiladores geralmente fazem a última otimização, ou alguns podem precisar de certos sinalizadores para indicar que a otimização é necessária. É importante lembrar que a palavra-chave inline é tratada como uma sugestão e não como uma garantia do compilador. Ainda assim, o programador pode preferir marcar funções sempre que possível para atingir o desempenho ideal.

A boa regra é que vale a pena inlining a função se for relativamente pequena e for chamada em um lugar. A função pode ser inline especificando a palavra-chave inline no início de sua definição. O exemplo a seguir demonstra duas funções embutidas chamadas doubleInt e convolutionInt. Depois que o compilador realmente alinha a função, sua sequência de código é inserida no corpo das funções do chamador, semelhante às expressões de macro quando substituem a sequência de string fornecida pelo trecho correspondente.

#include <iostream>

inline int doubleInt(int a) { return a + a; }

inline int convolutionInt(int a, int b) { return doubleInt(a) * b; }

int main() {
  int k = 10;

  std::cout << doubleInt(k) << std::endl;

  k = convolutionInt(k, k + 5);
  std::cout << k << std::endl;

  return EXIT_SUCCESS;
}

Em conclusão, não se deve tratar a função inlining como o método garantido para gerar melhor desempenho dos programas. Mais para o último ponto, é bastante difícil avaliar as compensações de desempenho das funções inline, pois os sistemas contemporâneos empregam vários mecanismos para executar o código mais rápido. Cada um desses mecanismos pode ser afetado pela marcação prematura das funções como inline.

Isso nos leva à armadilha comum da otimização de software como um problema geral. É considerado uma má prática tentar otimizar todas as partes do programa com antecedência. É melhor definir o perfil do programa para descobrir as partes de computação mais intensiva e concentrar o esforço de otimização nelas.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ Function