/ / Czy wszystkie instancje szablonów są tworzone w czasie kompilacji? - c ++, szablony, c ++ 11, szablony variadic

Czy wszystkie instancje szablonów są tworzone podczas kompilacji? - c ++, szablony, c ++ 11, variadic-templates

Po zapoznaniu się z szablonami funkcji variadic korzystających z rekurencji zastanawiam się:

Czy wszystkie instancje szablonów mogą możliwie być potrzebne podczas wykonywania programu utworzonego w czasie kompilacji? Czy istnieje coś takiego jak tworzenie instancji w locie?

Odpowiedzi:

3 dla odpowiedzi № 1

Szablony są tworzone w procesie konwertowania każdej przetłumaczonej jednostki tłumaczeniowej na jednostkę instancji.

Jednostka tłumacząca jest zasadniczo plikiem źródłowym.

Przetłumaczona jednostka tłumacząca (spróbuj powiedzieć, że trzy razy szybciej) jest wynikiem kompilacji bez tworzenia szablonów.

Jednostką tworzenia instancji jest zasadniczo przetłumaczona jednostka tłumacząca z tworzonymi szablonami.

To, czy wystąpienie wystąpi w „czasie kompilacji”, zależy od architektury implementacji.

W tradycyjnym „skompiluj do obiektów i połączobject "architektura (z którą większość programistów pracujących pod Windowsem lub Linuksem będzie zaznajomiona) generowanie przetłumaczonych jednostek tłumaczeniowych i generowanie jednostek tworzenia są zarówno fazami (być może połączonymi fazami) kompilatora. Zatem w tym modelu tworzenie instancji jest kompilacją aktywność czasowa.

Istnieją jednak implementacje korzystające z„smart linker”, a kompilator generuje przetłumaczone jednostki tłumaczeniowe z pewnymi dodatkowymi informacjami opisującymi, jakie instancje szablonów są potrzebne dla każdej przetłumaczonej jednostki tłumaczeniowej. Proces konwersji tych jednostek na instancję instancji jest następnie obsługiwany przez linker. Dzięki takim implementacjom tworzenie instancji szablonu jest zatem działaniem związanym z czasem połączenia, a nie działaniem czasu kompilacji. Celem tego modelu kompilacji jest to, że zapewnia on możliwości optymalizacji czasu połączenia (a tworzenie szablonu szablonu czasu połączenia jest bardziej efektem ubocznym niż celem).

Pierwsza implementacja z inteligentnym linkerem Inapotkany był dostępny jako dodatkowa opcja w Sun Microsystems na SunOS i późniejszych systemach Solaris (systemy operacyjne dostarczane domyślnie z zestawem narzędzi zawierającym bardziej typowy głupi linker). Od tego czasu spotkałem kilka innych takich łańcuchów narzędzi, ale nie mogę sobie przypomnieć od razu ich dostawców.

Nie znam żadnych implementacji, w których tworzenie wystąpień szablonów zachodzi w czasie wykonywania. Możliwe jednak, że interpreter C ++ może działać w ten sposób.


1 dla odpowiedzi nr 2

Wszystkie instancje szablonów są tworzone w czasie kompilacji. Cytat ze standardu:

N4296 2.2 / 1/8 [leks. Fazy]

Przetłumaczone jednostki tłumaczenia i jednostki tworzenia instancji są łączone jako następujące: [Uwaga: Niektóre lub wszystkie z nich mogą być dostarczane z biblioteki. - uwaga końcowa] Każda przetłumaczona jednostka tłumacząca jest sprawdzana w celu uzyskania lista wymaganych instancji. [Uwaga: może to obejmować instancje, które zostały wyraźnie zamówione (14.7.2). - koniec Uwaga ] Definicje wymaganych szablonów znajdują się. To jest zdefiniowane w implementacji, czy źródłojednostek tłumaczeniowych zawierające te definicje muszą być dostępne. [Uwaga: An implementacja może zakodować wystarczającą ilość informacji w przetłumaczonym języku jednostka tłumacząca, aby upewnić się, że źródło nie jest tutaj wymagane. - uwaga końcowa] Wszystkie wymagane instancje są wykonywane doprodukować jednostki tworzenia instancji. [Uwaga: są one podobne do przetłumaczonych jednostki tłumaczeniowe, ale nie zawierają odniesień do nieautoryzowanych szablony i brak definicji szablonów. - uwaga końcowa] Program jest źle sformułowane, jeśli wystąpi jakakolwiek instancja.