Две статические библиотеки, две разные векторные реализации, что будет делать компоновщик? - PullRequest
1 голос
/ 22 декабря 2009

Представьте, что у нас есть две статические библиотеки, созданные с различными реализациями std::vector. Оба этих двоичных файла будут иметь код как для push_back, так и для pop_back (поскольку вектор обычно является только заголовком). Что бы сделал компоновщик, когда мы попытались использовать обе эти библиотеки в проекте. Это даст ошибку? Может ли компоновщик удалить одну реализацию каждого из этих методов, чтобы было возможно следующее:

push_back вызов из второй библиотеки вызывает push_back реализацию из первой библиотеки

pop_back вызов из первой библиотеки вызывает pop_back реализация из второй библиотеки

Ответы [ 4 ]

3 голосов
/ 22 декабря 2009

Это даст ошибку? Зависит от того, как вы определяете «ошибка».

Это, вероятно, не даст вам ошибку во время соединения. Но это наверняка испортило бы ваш исполняемый файл. Линкер предполагает , когда он встречает несколько определений символа, что они идентичны, и поэтому все, кроме одного, могут быть отброшены. Если они не идентичны, вы нарушаете Правило Единого Определения, что означает, что вы движетесь в Неопределенную Страну Поведения. Все может случиться. Скорее всего, вы увидите случайные сбои.

1 голос
/ 22 декабря 2009

Скорее всего, для внешних вызовов будет выбрана одна из двух реализаций.

Поскольку здесь так много ошибок, я бы не стал этого делать. Вот некоторые проблемы:

  1. Когда объект создается, то место, которое он называется, определяет количество выделенных байтов. Итак, давайте предположим, что две реализации используют разные члены. Если выбранные внешние функции имеют больший размер, вы можете повредить память.
  2. Хотя для внешних вызовов будет выбрана одна из двух реализаций, компилятор мог встроить некоторые другие методы. Для реализации, которая теряет время компоновки, ее встроенные вызовы все еще будут существовать в коде и, скорее всего, будут вести себя неправильно.
1 голос
/ 22 декабря 2009

Наиболее распространенный (но не единственный) подход, который система компиляции использует для шаблонов, заключается в том, чтобы компилятор жадно создавал экземпляры всех шаблонов, которые используются в каждой единице перевода, что приводит к нескольким экземплярам. Затем компоновщик молча отбрасывает дубликаты.

Однако я бы определенно не полагался на такое поведение, чтобы справиться с двумя различными реализациями одного и того же (именованного) шаблона.

0 голосов
/ 22 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...