Perché mi viene consigliato di non inserire funzioni inline che vengono chiamate una sola volta?

3

Comprendo l'inlining come segue:

Una funzione separata contrassegnata come "inline" (supponendo che il compilatore faccia realmente inline) sarà "unita" alla funzione che viene chiamata.

vale a dire. (pseudo codice)

void main ()
{
  printf(b(2,3))  // will be printf(2*3*3);
}
inline function b(int x, int y)
{
  return x*y*y;
}

Tuttavia, ho avuto una discussione riguardante l'inlining e perché sono avvisato di non eseguire funzioni inline chiamate esattamente una volta nel mio codice (perché sono funzioni di inizializzazione)?

Ad esempio:

void main(){
    initFunctionA();
    SomeType destinationA;
    SomeType destinationB;
    InitDescriptionType description;
    //initialize DescriptionType
    initFunctionB(&description, destinationA&);
    initFunctionC(&description, destinationB&);
}

inline void initFunctionA()
{
    //do stuff
}
inline void initFunctionB(InitDescriptionType* desc, SomeType** destination)
{
    // Take Description and put something into destination
}
inline void initFunction(InitDescriptionType* desc, SomeType** destination)
{
    // Take Description and put something into destination
}

Non significherebbe che il mio codice di uscita è leggermente più piccolo (dato che non ci sono salti alle funzioni ecc.?)

€ dit: la domanda collegata non risponde alla mia domanda specifica. Nel mio caso, l'inizializzazione è una singola funzione. Il mio pensiero era "Ehi, perché non separo la mia inizializzazione in più funzioni più piccole per renderle leggibili e renderle in linea?"

    
posta Raildex 12.09.2018 - 11:50
fonte

1 risposta

7

In C e C ++, la parola chiave inline ha effetti che rendono possibile l'inline, ma anche molti altri effetti, come la soppressione della regola a una definizione (ODR). Questo può oscurare i bug.

Pertanto, la parola chiave inline deve essere utilizzata solo per le funzioni e altri oggetti che devono essere comunque definiti in un'intestazione. In particolare, qualsiasi definizione di funzione all'interno di una definizione di classe C ++ è già implicitamente in linea.

Ma se vuoi semplicemente rendere ottimizzazioni inlining possibili per il compilatore, dai invece quelle linkage interno . Questo è possibile attraverso la parola chiave static , o dal C ++ 11 attraverso namespace anonimi.

Si noti che se una chiamata di funzione viene eseguita solo una volta per l'esecuzione del programma, l'ottimizzazione di tale chiamata di funzione non ne vale la pena. Non sarai letteralmente in grado di notare alcuna differenza nelle prestazioni. Anziché ottimizzare il codice di inizializzazione, trova i veri e propri colli di bottiglia:

  1. Determina i tuoi effettivi requisiti di rendimento.
  2. Cerca il tuo codice per trovare hot spot e operazioni costose.
  3. Trova i modi per evitare quelle costose operazioni. In hot spot, le micro-ottimizzazioni possono a volte ripagare.
  4. Ripeti i passaggi 2 e 3 finché i requisiti di rendimento non sono soddisfatti.

Vedi anche:

risposta data 12.09.2018 - 12:39
fonte

Leggi altre domande sui tag