[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