Повторные определения шаблона функции

display: inline; и display: inline-block используют межстрочный интервал в отличие от display: block, который будет позиционировать элементы более точно.

Перемещая элементы div в одну строку, это заставляет элементы div иметь нулевое пространство между ними.

См. эту статью для получения дополнительной информации.

body {
    margin: 0px;
    padding: 0px;
}
div {
    min-height: 50vh;
    width: 50%;
    display: inline-block;
}
div:nth-child(1) {
    background-color: red;
}
div:nth-child(2) {
    background-color: green;
}
div:nth-child(3) {
    background-color: blue;
}
div:nth-child(4) {
    background-color: yellow;
}
Red
Green
Blue
Yellow

10
задан wilhelmtell 25 October 2008 в 03:53
поделиться

3 ответа

Для поддержки C++ компоновщик достаточно умен, чтобы распознать, что они являются всеми одинаковыми функция, и выводит все кроме одного.

Править: разъяснение: компоновщик не сравнивает функциональное содержание и решает, что они - то же. Шаблонные функции отмечены как таковые, и компоновщик распознает, что у них есть те же подписи.

5
ответ дан 4 December 2019 в 01:32
поделиться

У Гну руководство компилятора C++ есть хорошее обсуждение этого. Выборка:

Шаблоны C++ являются первой функцией языка, которая потребует большей аналитики от среды, чем каждый обычно находит в системе UNIX. Так или иначе компилятор и компоновщик должны удостовериться, что каждый шаблонный экземпляр происходит точно однажды в исполняемом файле, если он необходим, и нисколько иначе. Существует два основных подхода для этой проблемы, которые упоминаются как модель Borland и модель Cfront.

Модель Borland

Borland C++ решил шаблонную проблему инстанцирования путем добавления кода, эквивалентного из общих блоков их компоновщику; компилятор испускает шаблонные экземпляры в каждой единице перевода, которая использует их, и компоновщик сворачивает их вместе. Преимущество этой модели состоит в том, что компоновщик только должен рассмотреть сами объектные файлы; нет никакой внешней сложности для волнения о. Этот недостаток - то, что время компиляции увеличено, потому что код шаблона компилируется неоднократно. Код, написанный для этой модели, имеет тенденцию включать определения всех шаблонов в заголовочном файле, так как они, как должно замечаться, инстанцируют.

Модель Cfront

Переводчик C++ AT&T, Cfront, решил шаблонную проблему инстанцирования путем создания понятия шаблонного репозитория, автоматически сохраняемого места, где шаблонные экземпляры хранятся. Более современная версия репозитория работает следующим образом: Поскольку файлы отдельного объекта создаются, компилятор помещает любые шаблонные определения и инстанцирования, с которыми встречаются в репозитории. Во время ссылки обертка ссылки добавляет в объектах в репозитории и компилирует любые необходимые экземпляры, которые ранее не испускались. Преимуществами этой модели является более оптимальная скорость компиляции и способность использовать системного компоновщика; для реализации модели Borland, поставщик компилятора также должен заменить компоновщика. Недостатки являются значительно увеличенной сложностью и таким образом потенциалом для ошибки; для некоторого кода это может быть столь же прозрачно, но на практике может быть очень трудно создать несколько программ в одном каталоге и одну программу в нескольких каталогах. Код, написанный для этой модели, имеет тенденцию разделять определения невстроенных членских шаблонов в отдельный файл, который должен быть скомпилирован отдельно.

При использовании с GNU ld версия 2.8 или позже система ELF, такая как GNU/Linux или Солярис 2, или на Microsoft Windows, G ++ поддерживает модель Borland. В других системах, G ++ не реализует никакую автоматическую модель.

4
ответ дан 4 December 2019 в 01:32
поделиться

Это - более или менее особый случай только для шаблонов.

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

Так как трудно решить это (стандарт имеет extern ключевое слово для шаблонов, но g ++ не реализует его), компоновщик просто принимает повторные определения.

1
ответ дан 4 December 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: