2010-03-05 11 views
5

So che il compilatore può o non può eseguire l'espansione in linea di una funzione, richiesta o meno dal programmatore.
Ero solo curioso di sapere, c'è un modo in cui il programmatore può sapere per certo che il compilatore ha delineato una funzione particolare?Funzioni in linea

+2

Domanda più appropriata, c'è un modo in cui il programmatore può sapere per certo che il compilatore ha inarcato una particolare funzione * chiamata *? – Potatoswatter

risposta

10

Altro che guardando il codice generato, no. Alcune implementazioni possono fornire tali informazioni ma non sono richieste dallo standard.

Cose come inline o register (brivido) sono suggerimenti al compilatore ed è libero di accettarle, ignorarli o addirittura mentire a voi che è fatto, mentre di nascosto va dietro la schiena e non farlo :-)

Tendo a non utilizzare funzioni del genere poiché sospetto che il compilatore spesso sappia meglio di come estorcere il maggior numero di prestazioni dal mio codice.

0

Leggere lo smontaggio del file oggetto.

1

Imposta il compilatore per generare il codice assembler e controllare lì.

+0

E se si dispone di flag diversi per le versioni di debug v release, assicurarsi di utilizzare quest'ultimo. Ho visto alcuni compilatori che non sono mai in linea a meno che non sia abilitato almeno un po 'di ottimizzazione. –

2

È possibile profilare il proprio codice e verificare se la funzione di interesse viene visualizzata nello stack di chiamate. Sebbene, suppongo, non vi è alcuna garanzia che la frequenza di campionamento dello stack non sia abbastanza elevata.

Ma può dimostrare che è inline: se si sa A chiamate B, che invita C, e A non chiama mai C direttamente, se si vede A chiamando C sul stack di chiamate, si sa B stato inline per tale chiamata .

0

Non c'è modo di sapere se non per guardare l'assemblatore di uscita.

I compilatori in questi giorni sono "intelligenti" e decidono che cosa funzioni in linea e in quali casi.

Proprio come la parola chiave del registro, i compilatori eseguono il ritiro in questi giorni e ignorano davvero le vostre richieste.

0

Non credo ci sia un modo per scoprire ciò che si vuole,

Ma è possibile aumentare le possibilitá della funzione di essere una funzione inline da,

Rendere la definizione della funzione visibile all'unità di traduzione in cui è chiamato. Devi sempre mettere la definizione di una funzione in linea nel file di intestazione.

Problemi correlati