Что такое «добавочное связывание»?


105

Я просмотрел Microsoft MSDN и все в Интернете, но до сих пор не смог понять, что это такое.

Означает ли это, что завершенная программа загружает библиотеки DLL в разное время во время выполнения, а не все сразу при запуске?

Я совсем далеко? :)


1
Я добавил ответ для GNU ld, но он был удален, вот похожий: stackoverflow.com/questions/29391965/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Он был удален, потому что «Копировать, Вставить и Дивергировать» - это плохо - независимо от того, насколько хорош контент en.wikipedia.org/wiki/Don%27t_repeat_yourself
MarcH

Ответы:


122

Связывание включает объединение всех файлов .obj, созданных из ваших исходных файлов, а также любых файлов .lib, на которые вы ссылаетесь, в ваш вывод (например, .exe или .dll).

Без инкрементального связывания это нужно делать каждый раз с нуля.

Добавочное связывание связывает ваш exe / dll таким образом, чтобы компоновщику было проще обновить существующий exe / dll, когда вы вносите небольшие изменения и повторно компилируете.

Таким образом, добавочная компоновка просто ускоряет компиляцию и компоновку вашего проекта.

Единственный эффект времени выполнения, который он может иметь, заключается в том, что он может сделать ваш exe / dll немного больше и медленнее, как описано здесь:

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

Изменить: как упоминал Логан, инкрементное связывание также несовместимо с генерацией кода времени связывания - поэтому теряется возможная оптимизация производительности.

Вы можете использовать инкрементное связывание для отладочных сборок, чтобы ускорить разработку, но отключите его для сборок выпуска, чтобы повысить производительность во время выполнения.

Возможно, вы думаете о задержанных загружаемых DLL:

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


Ах, я думал, линкеры всегда так поступали! Итак, отключение incremental linkingзаставит компоновщик каждый раз связывать все с нуля?
Russel

6
«На практике, вероятно, не стоит беспокоиться о последствиях этого». Вероятно, стоит упомянуть, что, хотя разница между «нормальным» связыванием и добавочным связыванием может быть не такой большой с точки зрения производительности во время выполнения, добавочное связывание несовместимо с генерацией кода времени компоновки, что может существенно повлиять на производительность.
Logan Capaldo

2
@Russel: Да, будет. @Logan: Спасибо, я обновил свой ответ.
Saxon Druce

Значит ли это, что мы должны отключить эту опцию для производственных сборок?
RBT

1
@RBT, да, вы должны.
Аджай

15

Также, что очень важно, инкрементная ссылка является предпосылкой для Edit&Continue- возможности редактировать ваш код и перекомпилировать его на лету, без перезапуска.

Так что хорошо иметь отладочные сборки, но не релизные сборки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.