/OPT (Ottimizzazioni)

Controlla le ottimizzazioni eseguite da LINK durante una compilazione.

Sintassi

/OPT:{REF | NOREF}
/OPT:{ICF[=iterazioni] | NOICF}
/OPT:{LBR | NOLBR}

Argomenti

REF | NOREF

/OPT:REF elimina funzioni e dati a cui non viene mai fatto riferimento; /OPT:NOREF mantiene funzioni e dati a cui non viene mai fatto riferimento.

Quando /OPT:REF è abilitato, LINK rimuove le funzioni e i dati in pacchetto non referenziati, noti come COMDAT. Questa ottimizzazione è nota come eliminazione COMDAT transitiva. L'opzione /OPT:REF disabilita anche il collegamento incrementale.

Le funzioni inlined e le funzioni membro definite all'interno di una dichiarazione di classe sono sempre COMDAT. Tutte le funzioni in un file oggetto vengono create in COMDAT se compilate usando l'opzione /Gy . Per inserire const i dati in COMDAT, è necessario dichiararli usando __declspec(selectany). Per informazioni su come specificare i dati per la rimozione o la riduzione, vedere selectany.

Per impostazione predefinita, /OPT:REF è abilitato dal linker a meno che non sia specificato /OPT:NOREF o /DEBUG . Per eseguire l'override di questo valore predefinito e mantenere i COMDAT non referenziati nel programma, specificare /OPT:NOREF. È possibile usare l'opzione /INCLUDE per eseguire l'override della rimozione di un simbolo specifico.

Se si specifica /DEBUG , il valore predefinito per /OPT è NOREF e tutte le funzioni vengono mantenute nell'immagine. Per eseguire l'override di questa build predefinita e ottimizzare una compilazione di debug, specificare /OPT:REF. Ciò può ridurre le dimensioni del file eseguibile e può essere un'ottimizzazione utile anche nelle compilazioni di debug. È consigliabile specificare anche /OPT:NOICF per mantenere le funzioni identiche nelle compilazioni di debug. Questo semplifica la lettura delle tracce dello stack e l'impostazione di punti di interruzione nelle funzioni che altrimenti verrebbero ridotte insieme.

ICF[=iterazioni] | NOICF

Usare ICF[=iterazioni] per eseguire la riduzione COMDAT identica. I dati COMDAT ridondanti possono essere rimossi dall'output del linker. Il parametro delle iterazioni facoltative specifica il numero di volte in cui attraversare i simboli per i duplicati. Il numero predefinito di iterazioni è 1. Attraverso iterazioni aggiuntive si potrebbero trovare più duplicati rivelati attraverso la riduzione nell'iterazione precedente.

Per impostazione predefinita, /OPT:ICF è abilitato dal linker a meno che non sia specificato /OPT:NOICF o /DEBUG . Per eseguire l'override di questo valore predefinito e impedire che i COMDAT vengano piegati nel programma, specificare /OPT:NOICF.

In una compilazione di debug è necessario specificare in modo esplicito /OPT:ICF per abilitare la riduzione COMDAT. Tuttavia, poiché /OPT:ICF può unire funzioni o dati identici, può modificare i nomi di funzione visualizzati nelle tracce dello stack. Può anche rendere impossibile impostare punti di interruzione in determinate funzioni o esaminare alcuni dati nel debugger e può includere funzioni impreviste quando si esegue un singolo passaggio del codice. Il comportamento del codice è identico, ma la presentazione del debugger può generare confusione. Pertanto, non è consigliabile usare /OPT:ICF nelle compilazioni di debug, a meno che i vantaggi del codice più piccolo non superino questi svantaggi.

Nota

Poiché /OPT:ICF può causare l'assegnazione dello stesso indirizzo a funzioni diverse o a membri di dati di sola lettura ( ovvero le const variabili durante la compilazione tramite /Gy), può interrompere un programma che dipende da indirizzi univoci per funzioni o membri di dati di sola lettura. Per altre informazioni, vedere /Gy (Attiva collegamento a livello di funzione).

LBR | NOLBR

Le opzioni /OPT:LBR e /OPT:NOLBR si applicano solo ai file binari ARM. Poiché alcune istruzioni del ramo del processore ARM hanno un intervallo limitato, se il linker rileva un passaggio a un indirizzo non compreso nell'intervallo, sostituisce l'indirizzo di destinazione dell'istruzione del ramo con l'indirizzo di un codice "isola" che contiene un'istruzione di ramo destinata alla destinazione effettiva. È possibile usare /OPT:LBR per ottimizzare il rilevamento di istruzioni di rami lunghi e la posizione delle isole di codice intermedie per ridurre al minimo le dimensioni complessive del codice. /OPT:NOLBR indica al linker di generare isole di codice per istruzioni di ramo lunghe man mano che vengono rilevate, senza ottimizzazione.

Per impostazione predefinita, l'opzione /OPT:LBR viene impostata quando il collegamento incrementale non è abilitato. Se si desidera un collegamento non incrementale ma non le ottimizzazioni di rami lunghe, specificare /OPT:NOLBR. L'opzione /OPT:LBR disabilita il collegamento incrementale.

Osservazioni:

Se usato nella riga di comando, per impostazione predefinita il linker è /OPT:REF,ICF,LBR. Se si specifica /DEBUG , il valore predefinito è /OPT:NOREF,NOICF,NOLBR.

Le ottimizzazioni /OPT riducono in genere le dimensioni dell'immagine e aumentano la velocità del programma. Questi miglioramenti possono essere sostanziali in programmi di grandi dimensioni, motivo per cui sono abilitati per impostazione predefinita per le build di vendita al dettaglio.

L'ottimizzazione del linker richiede tempo aggiuntivo, ma il codice ottimizzato consente anche di risparmiare tempo quando il linker ha meno rilocazione da correggere e crea un'immagine finale più piccola e consente di risparmiare ancora più tempo quando ha meno informazioni di debug per elaborare e scrivere nel PDB. Quando l'ottimizzazione è abilitata, può comportare un tempo di collegamento più rapido nel complesso, poiché il piccolo costo aggiuntivo nell'analisi può essere più che compensato dal risparmio di tempo nel passaggio del linker su file binari più piccoli.

Gli argomenti /OPT possono essere specificati insieme, separati da virgole. Ad esempio, anziché /OPT:REF /OPT:NOICF, è possibile specificare /OPT:REF,NOICF.

È possibile usare l'opzione del linker /VERBO edizione Standard per visualizzare le funzioni rimosse da /OPT:REF e le funzioni piegate da /OPT:ICF.

Gli argomenti /OPT vengono spesso impostati per i progetti creati usando la finestra di dialogo Nuovo progetto nell'IDE di Visual Studio e in genere hanno valori diversi per le configurazioni di debug e versione. Se non viene impostato alcun valore per queste opzioni del linker nel progetto, è possibile ottenere le impostazioni predefinite del progetto, che possono essere diverse dai valori predefiniti usati dal linker nella riga di comando.

Per impostare l'opzione del linker OPT:ICF o OPT:REF nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Ottimizzazione linker>proprietà Proprietà>di configurazione.

  3. Modificare una di queste proprietà:

    • Abilitare la riduzione COMDAT

    • Riferimenti

Per impostare l'opzione del linker OPT:LBR nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle >proprietà Proprietà del linker della riga di comando del linker>di configurazione.

  3. Immettere l'opzione in Opzioni aggiuntive:

    /opt:lbr oppure /opt:nolbr

Per impostare l'opzione del linker a livello di codice

Vedi anche