Domanda

Trovo molte risorse online che si arrampica su come inline (e persino __attribute__((always_inline)) o __forceinline) non costringe il compilatore (ad es. GCC o Visualc ++) per inlineare la funzione. Ma quando non verrà applicato esattamente in linea? C'è un esempio di giocattolo?

Forse non necessariamente la stessa domanda, quando una funzione taggata inline Incluso in due diversi file CPP creano problemi durante il collegamento? Vale a dire, generare simboli duplicati?

Ecco una sandbox in cemento per provare a rompere il compilatore in linea e generare un simbolo duplicato:

In myinline.h:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}

In aux.cpp:

#include "myinline.h"
int aux()
{
  return my_inline();
}

In main.cpp:

#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}

Quindi, ad esempio, nel caso di GCC, c'è un codice (minimo) per myinline Ciò causerà un simbolo duplicato durante la compilazione e il collegamento con:

g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o

?

È stato utile?

Soluzione

"Inlining" e "Simboli duplicati" sono cose diverse. Il inline Le parole chiave consentono esplicitamente più definizioni (cioè ti esonera dalla regola a una definizione), quindi la piattaforma (compilatore e linker) deve sapere come gestire e deduplicare questo.

(Questo accade continuamente per le funzioni dei membri della classe definiti nelle intestazioni.)

Se vuoi solo generazione di codice Per accadere, puoi archiviare l'indirizzo della funzione da qualche parte:

auto fp = my_inline;

In questo modo il compilatore deve generare una definizione della funzione, in modo da essere in grado di dargli un indirizzo. Ma anche se lo fai in ogni unità di traduzione, non riceverai un errore di linker, poiché questo verrà deduplicato al momento del collegamento. Il requisito che tutte le definizioni siano identiche si assicura che ciò sia ben definito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top