Che cos'è il "collegamento incrementale"?


105

Ho esaminato MSDN di Microsoft e tutto il Web, ma non sono ancora riuscito a farmi un'idea veramente chiara di cosa sia.

Significa che il programma completato carica le DLL in momenti diversi durante la sua esecuzione, invece di tutto in una volta all'avvio?

Sono completamente fuori di testa? :)


1
Ho aggiunto una risposta per GNU ld, ma è stato eliminato, ecco uno simile: stackoverflow.com/questions/29391965/...
Ciro Santilli郝海东冠状病六四事件法轮功

È stato cancellato perché Copy, Paste e Diverge è un male, non importa quanto sia buono il contenuto en.wikipedia.org/wiki/Don%27t_repeat_yourself
MarcH

Risposte:


122

Il collegamento implica il confezionamento di tutti i file .obj creati dai file sorgente, così come qualsiasi file .lib a cui si fa riferimento, nel proprio output (ad esempio .exe o .dll).

Senza collegamento incrementale, questo deve essere fatto da zero ogni volta.

Il collegamento incrementale collega il tuo exe / dll in un modo che rende più facile per il linker aggiornare l'exe / dll esistente quando si apporta una piccola modifica e si ricompila.

Quindi, il collegamento incrementale rende solo più veloce la compilazione e il collegamento del progetto.

L'unico effetto di runtime che potrebbe avere è che potrebbe rendere il tuo exe / dll leggermente più grande e più lento, come descritto qui:

http://msdn.microsoft.com/en-us/library/4khtbfyf.aspx

Modifica: come menzionato da Logan, il collegamento incrementale è anche incompatibile con la generazione del codice temporale del collegamento perdendo quindi una possibile ottimizzazione delle prestazioni.

È possibile utilizzare il collegamento incrementale per le build di debug per accelerare lo sviluppo, ma disabilitarlo per le build di rilascio per migliorare le prestazioni di runtime.

Ritardare le DLL caricate potrebbe essere ciò a cui stai pensando:

http://msdn.microsoft.com/en-us/library/151kt790.aspx


Ah, pensavo che i linker lo facessero sempre comunque! Quindi, spegnendo incremental linkingogni volta il linker collegherà tutto da zero?
Russel

6
"In pratica, probabilmente non vale la pena preoccuparsi dell'effetto di questo." probabilmente vale la pena ricordare che mentre la differenza tra il collegamento "normale" e il collegamento incrementale potrebbe non essere così grande in termini di prestazioni in fase di esecuzione, il collegamento incrementale è incompatibile con la generazione del codice in fase di collegamento che può fare una drastica differenza di prestazioni.
Logan Capaldo

2
@Russel: Sì, lo farà. @ Logan: Grazie, ho aggiornato la mia risposta.
Saxon Druce

Quindi questo significa che dovremmo disattivare questa opzione per le build di produzione?
RBT

1
@RBT, sì, devi.
Ajay

15

Inoltre, cosa molto importante, il collegamento incrementale è un prerequisito per Edit&Continue - possibilmente modificare il codice e ricompilarlo al volo, senza riavviare.

Quindi è una buona cosa avere sulle build di debug, ma non sulle build di rilascio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.