[devel] Re: C++ ABI
Alexey Rusakov
=?iso-8859-1?q?ktirf_=CE=C1_altlinux=2Eorg?=
Пн Окт 17 18:34:25 MSD 2005
On 17.10.2005 17:12, Alexey Tourbin wrote:
> В библиотеке libstdc++ есть шаблоны. Они
> компилируются в саму эту библиотеку, или остаются исключительно в
> хедерах?
>
Только в хедерах. Кстати, по этой причине реализацию шаблонных функций и
методов шаблонных классов нельзя класть в файлы .cc/.cpp/.cxx . Эти
реализации будут доступны только в этих самых файлах и нигде больше.
>> Если грубо, то на сегодня последний момент, когда создаётся бинарный
>> код, соответствующий шаблону - это компиляция точки инстанцирования
>> шаблона.
>>
> Что это означает? Если какая-то библиотека содержит шаблон, то
> бинарного кода в самом библиотеке нет, а он будет порождаться каждый раз
> при инстанцировании?
Да.
> То есть все приложения, которые инстанцируют
> шаблон, получат библиотечный "довесок"?
>
Если под "довеском" понимается код, реализующий кокретную специализацию
шаблона, то да.
> Вот пример: в хедере <string> содержится определение:
>
> typedef basic_string<char> string;
>
> typdef считается инстанцированием, или только алиасом для последющего
> инстанцирования?
Некоторые компиляторы это считают инстанцированием, кажется. Но бинарный
код, соответствующий этой специализации шаблона, всё равно будет
генериться каждый раз при компиляции бинарника. А потом линкеры
совершают нехилые кульбиты, чтобы избежать duplicate symbols.
> Где находится бинарный код класса string: в библиотеке
> libstdc++ или же в каждом бинаре, который инстанцирует этот шаблон?
>
В библиотеке он есть, потому что сама библиотека используется
basic_string<char> . Но как экспортируемый символ, basic_string<char>
библиотека не предоставляет.
> Если я правильно понимаю, то C++ ABI для библиотечных шаблонов как бы
> вообще отсутствует, т.к. код шаблонов генерируется при каждом
> фактическом инстанцировании. Так?
>
Так.
--
Alexey "Ktirf" Rusakov
Подробная информация о списке рассылки Devel