Co to jest „przyrostowe łączenie”?


105

Spojrzałem na MSDN firmy Microsoft i całą sieć, ale nadal nie byłem w stanie uzyskać naprawdę dobrego pojęcia, co to jest.

Czy to oznacza, że ​​ukończony program ładuje biblioteki DLL w różnym czasie podczas jego wykonywania, tak jak wszystkie na raz po uruchomieniu?

Czy jestem całkiem daleko? :)


1
Dodałem odpowiedź dla GNU ld, ale została usunięta, tutaj jest podobna: stackoverflow.com/questions/29391965/ ...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Został usunięty, ponieważ Copy, Paste and Diverge jest zły - bez względu na to, jak dobra jest zawartość en.wikipedia.org/wiki/Don%27t_repeat_yourself
MarcH

Odpowiedzi:


122

Łączenie obejmuje pakowanie razem wszystkich plików .obj utworzonych z plików źródłowych, a także wszelkich plików .lib, do których się odwołujesz, do danych wyjściowych (np. .Exe lub .dll).

Bez linkowania przyrostowego należy to robić za każdym razem od zera.

Łączenie przyrostowe łączy twój exe / dll w sposób, który ułatwia konsolidatorowi aktualizację istniejącego exe / dll po wprowadzeniu niewielkiej zmiany i ponownej kompilacji.

Łączenie przyrostowe przyspiesza więc kompilację i łączenie projektu.

Jedynym efektem działania, jaki może mieć, jest to, że może sprawić, że twój exe / dll będzie nieco większy i wolniejszy, jak opisano tutaj:

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

Edycja: jak wspomniał Logan, łączenie przyrostowe jest również niekompatybilne z generowaniem kodu czasu łącza, co powoduje utratę możliwej optymalizacji wydajności.

Możesz chcieć użyć linkowania przyrostowego do debugowania kompilacji, aby przyspieszyć programowanie, ale wyłącz to dla kompilacji wydania, aby poprawić wydajność środowiska wykonawczego.

Biblioteki DLL ładowane z opóźnieniem mogą być tym, o czym myślisz:

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


Ach, myślałem, że linkerzy i tak zawsze to robią! Zatem wyłączenie incremental linkingspowoduje, że linker będzie łączył wszystko od zera za każdym razem?
Russel

6
„W praktyce nie warto się martwić skutkiem tego”. warto chyba wspomnieć, że chociaż różnica między "normalnym" łączeniem a łączeniem przyrostowym może nie być tak dobra pod względem wydajności w czasie wykonywania, to łączenie przyrostowe jest niekompatybilne z generowaniem kodu czasu łącza, co może spowodować drastyczną różnicę w wydajności.
Logan Capaldo

2
@Russel: Tak, będzie. @Logan: Dzięki, zaktualizowałem moją odpowiedź.
Saxon Druce

Czy to oznacza, że ​​powinniśmy wyłączyć tę opcję dla kompilacji produkcyjnych?
RBT

1
@RBT, tak, musisz.
Ajay

15

Ponadto, co dość ważne, link przyrostowy jest warunkiem wstępnym Edit&Continue- możliwości edytowania kodu i ponownej kompilacji w locie, bez ponownego uruchamiania.

Dlatego dobrze jest mieć kompilacje debugowania, ale nie kompilacje wydania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.