ProgrammazioneSviluppatore C++ / Programmatore di sistema

Che cosa sono le funzioni inline in C++, come funziona la parola chiave inline? Quali sono i reali limiti e i rischi dell'uso eccessivo delle funzioni inline in grandi costruzioni?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Le funzioni inline sono funzioni per le quali il compilatore può (ma non è obbligato a) sostituire la chiamata con l'inserimento diretto del codice della funzione nel punto di chiamata. Per questo si utilizza la parola chiave inline.

  • La parola chiave inline dà un consiglio al compilatore, ma non è un obbligo: può essere ignorata se la funzione è troppo complessa.
  • In realtà, le funzioni definite all'interno di una classe sono considerate inline per impostazione predefinita.
  • Le funzioni inline vengono spesso utilizzate per funzioni brevi e frequentemente chiamate, per evitare il sovraccarico delle chiamate.

Limiti e rischi:

  • La duplicazione frequente del codice con un numero elevato di chiamate e l'inclusione della stessa funzione header in file diversi può aumentare significativamente la dimensione del binario.
  • Funzioni complesse o funzioni che chiamano altre funzioni inline potrebbero non essere espanse inline dal compilatore.

Esempio:

inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() sarà considerata come inline

Domanda ingannevole.

Domanda: Garantisce la parola chiave inline che la funzione sarà incorporata in tutti i punti di chiamata?

Risposta: No. Il compilatore decide autonomamente l'inserimento della funzione inline, in base a intuizioni interne. inline è solo una raccomandazione.

Esempi di errori reali a causa della mancata conoscenza delle sottigliezze dell'argomento.


Storia

In un sistema finanziario è stato scritto un logger frequentemente utilizzato con decine di grandi funzioni inline. Dopo la crescita del sistema, la dimensione del binario è aumentata notevolmente, portando a un aumento dei tempi di collegamento e a una riduzione dell'efficienza della cache sul server.


Storia

Durante la migrazione di software multipiattaforma, è emerso che alcuni compilatori (ad esempio, MSVC e GCC) gestiscono diversamente inline: parte delle funzioni non veniva espansa inline, parte invece lo era, causando differenze di velocità e dimensioni delle applicazioni difficilmente replicabili tra le piattaforme.


Storia

Uno sviluppatore ha dichiarato funzioni inline solo nel file header, ma ha spostato l'implementazione in un file cpp separato. Di conseguenza, durante il collegamento si sono verificati errori di definizione multipla o esterna irrisolta, poiché le funzioni inline devono essere definite nei header.