L'impostazione di una funzione pubblica influisce sulla capacità del compilatore C # di integrare la funzione come ottimizzazione?

3

Questo potrebbe essere o per i compilatori .NET o Mono.

So che, in determinate condizioni, il compilatore può integrare funzioni (ad esempio, sito di piccole e singole chiamate, ecc.) come ottimizzazione. Tuttavia, se la funzione è pubblica, è necessario disporre di un punto di ingresso esterno.

In questi casi, viene generato un codice duplicato (punto di ingresso pubblico che non viene utilizzato dal codice interno poiché il codice interno utilizza la versione inlineata) o contrassegnandolo come pubblico impedisce al compilatore di eseguire tale ottimizzazione?

    
posta Neal Tibrewala 18.09.2013 - 23:47
fonte

1 risposta

4

Ho trovato questo interessante articolo sui metodi C # inline .

L'ambito di un metodo non sembra cambiare quando una funzione diventa un candidato in linea. Ecco un riassunto di questo articolo.

How to determine what get’s inlined? The short answer is that you can’t. The MSDN article “Writing High-Performance Managed Applications : A Primer” gives the following guidance:

  1. Methods that are greater than 32 bytes of IL will not be inlined.
  2. Virtual functions are not inlined.
  3. Methods that have complex flow control will not be in-lined. Complex flow control is any flow control other than if/then/else; in this case, switch or while.
  4. Methods that contain exception-handling blocks are not inlined, though methods that throw exceptions are still candidates for inlining.
  5. If any of the method’s formal arguments are structs, the method will not be inlined.

Non c'è una parola chiave inline in C #, ma esiste una direttiva del compilatore inline introdotta in .NET 4.5 chiamata MethodImplOptions.AggressiveInlining

Può essere usato in questo modo.

[MethodImpl(MethodImplOptions.AggressiveInlining)]
static int Method2()
{
// ... Aggressive inlining.
return "one".Length + "two".Length + "three".Length +
    "four".Length + "five".Length + "six".Length +
    "seven".Length + "eight".Length + "nine".Length +
    "ten".Length;
}

Non puoi sapere con certezza se il compilatore integrerà una funzione. Questa non è una caratteristica che gli sviluppatori C hanno il controllo.

    
risposta data 30.09.2013 - 03:25
fonte

Leggi altre domande sui tag