Spec-Zone.ru › GCC 5

7.3 Неявная связь

В C++ есть несколько конструкций, которые требуют места в объектном файле, но не связаны однозначно с единым модулем трансляции. Мы говорим, что у этих конструкций «неявная связь». Обычно такие конструкции генерируются там, где они необходимы, хотя иногда мы можем действовать более хитро.

Встроенные функции

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

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

Таблицы виртуальных функций

Виртуальные функции C++ в большинстве компиляторов реализуются с помощью таблицы поиска, известной как таблица виртуальных функций (vtable). Таблица виртуальных функций содержит указатели на виртуальные функции, предоставляемые классом, и каждый объект класса содержит указатель на свою таблицу виртуальных функций (или таблицы виртуальных функций в ситуациях множественного наследования). Если класс объявляет какие-либо не встроенные, не чистые виртуальные функции, то первая из них выбирается в качестве «ключевого метода» для класса, и таблица виртуальных функций генерируется только в том модуле трансляции, где определён ключевой метод.

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

type_info объекты

C++ требует записи информации о типах для реализации ‘dynamic_cast’, ‘typeid’ и обработки исключений. Для полиморфных классов (классы с виртуальными функциями) объект ‘type_info’ записывается вместе с таблицей виртуальных функций, чтобы ‘dynamic_cast’ мог определить динамический тип объекта класса во время выполнения. Для всех остальных типов мы записываем объект ‘type_info’, когда он используется: при применении ‘typeid’ к выражению, при выбрасывании объекта, или при ссылке на тип в блоке обработки исключений или спецификации исключения.

Шаблонные инстанциации

Большинство из этого раздела также относится к шаблонным инстанциациям, но есть и другие варианты. См. Где шаблон?.

При использовании с GNU ld версии 2.8 или более поздней на системе ELF, такой как GNU/Linux или Solaris 2, или на Microsoft Windows, дублированные копии этих конструкций будут удалены во время компоновки. Это известно как поддержка COMDAT.

На целевых платформах, которые не поддерживают COMDAT, но поддерживают слабые символы, GCC использует их. Таким образом, одна копия заменяет все остальные, но неиспользуемые копии всё равно занимают место в исполняемом файле.

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

См. Объявления и определения в одном заголовке, чтобы узнать другой способ управления размещением этих конструкций.

Далее: Интерфейс C++, Предыдущее: Ограниченные указатели, Вернуться к: Расширения C++ [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Vague-Linkage.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API