2014-10-04 8 views

ответ

0

Предположим, у вас есть функция, объявленная как:

void f(int, char); 

, а также как:

void f(int); 

И вы называете функцию F (4) с правой подписью. Это привязка. Линкер свяжется с доступным определением тела функции для соответствия f с сигнатурой void f (int);

3

Связывание - это слово, которое используется в нескольких контекстах. Это всегда связано с подключением одной вещи к другой, но когда действие привязки может различаться.

Существует понятие времени привязки или точка, с которой какой-либо компонент связан с каким-либо другим компонентом. Основной список времени привязки: (1) привязка во время компиляции, (2) привязка во время связи, (3) привязка во время загрузки и (4) привязка во время выполнения.

Связывание при компиляции происходит при компиляции исходного кода. Для C/C++ существуют два основных этапа: препроцессор, который выполняет замену исходного текста, например, замену замены или замену макроса, и компиляцию исходного текста, который преобразует исходный текст в машинный код вместе с необходимыми инструкциями для компоновщика.

Связывание при времени ссылки, когда внешние символы связаны с определенным набором объектных файлов и библиотек. У вас может быть несколько разных статических библиотек, которые имеют одинаковый набор имен функций, но фактическая реализация функции различна. Таким образом, вы можете выбрать, какую библиотечную реализацию использовать, выбирая разные статические библиотеки.

Привязка при загрузке - это когда загрузчик загружает исполняемый файл в память вместе с любыми динамическими или разделяемыми библиотеками. Загрузчик связывает вызовы функций с конкретной динамической или разделяемой библиотекой, и выбранная библиотека может отличаться.

Привязка во время выполнения - это когда программа фактически запущена и делает выбор в зависимости от текущего потока выполнения.

Таким образом, соединение фактически является одним из типов привязки. Взгляните на этот stackoverflow static linking vs dynamic linking, который содержит дополнительную информацию о ссылках и библиотеках.

Вы также можете быть заинтересованы в std::bind в C++, так что вот статья stackboxflow std::function and std::bind what are they when they should be used.

Чем дольше вы ждете, пока что-то не связано с чем-то другим, это может обеспечить необходимую степень гибкости в использовании программного обеспечения. Однако часто существует компромисс между задержкой связывания и эффективностью времени выполнения, а также сложностью источника.

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

Возможно, вы можете скопировать имя файла, связав его во время компиляции, а это значит, что его можно использовать только с одним файлом. Чтобы изменить имя файла, вы должны изменить источник и перекомпилировать.

Возможно, у вас есть имя файла, введенное пользователем, например, с приглашением пользователя или аргументом командной строки, связывающим имя файла с открытым файлом во время выполнения. Чтобы изменить имя файла, вам больше не нужно перекомпилировать, вы можете просто запустить программу еще раз с другим именем файла.

0

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

Если вы хотите узнать, что такое ссылка, то здесь короткое объяснение.

Предположим, что вы создали определенную пользователем функцию sum(), чье объявление имеет значение int sum (int, int); , тогда всякий раз, когда функция вызывается из программы, ваша программа должна знать, где сканировать в памяти, чтобы выполнить эту функцию. Говоря простыми словами, адрес вашей функции должен быть известен вашей программе, чтобы добраться до ее тела, которое называется привязкой.

Теперь сумма определяется пользователем, поэтому она будет присутствовать в самом исходном коде. Если он вызывается из main(), он будет связан с main во время компиляции, потому что в это время компилятор будет знать, где ваша функция будет присутствовать в исполняемом файле. Это называется статической привязкой.

Теперь подумайте о том, что printf() является библиотечной функцией, а ее тело отсутствует в вашей программе. Поэтому, когда программа скомпилирована, тело printf не будет присутствовать в вашем скомпилированном исполняемом файле. Он будет загружен в память при выполнении вашей программы, и ее адрес будет известен как основной во время выполнения, а не во время компиляции в виде суммы sum(). Этот тип связывания называется динамическим связыванием.