Chcę zmniejszyć rozmiar plików .obj w dużym projekcie, nad którym pracuję (wiem, że linker usuwa zduplikowane definicje, ale chcę przyspieszyć proces kompilacji). Jednym z powodów ich rozmiaru jest to, że każda klasa, która używa std::vector<double>
lub std::vector<std::string>
, kończy kompilowanie kodu tej klasy i umieszczanie jej w pliku .obj. Próbowałem jawnie utworzyć instancję std::vector<double>
i użyć deklaracji extern template
, ale to nie działa - std::vector
w Visual Studio C++ STL ma wszystkie metody w linii. Bez modyfikacji kodu STL (czego nie zrobię), czy istnieje sposób zmuszenia kompilatora do niewprowadzania instancji do instancji i do korzystania z zewnętrznej instancji wersji std::vector<double>
?Unikaj wstawiania kodu utworzonego z ewidentnie utworzonego kodu std :: vector <T>? (Visual Studio C++ 2008)
Odpowiedz
Jedyne, co przychodzi mi na myśl, to napisanie nagłówka włączającego, który definiuje szablon std::vector
(ale nie jego członków, które muszą być zadeklarowane) i uwzględnia to zamiast standardowego nagłówka vector
.
Następnie można jawnie utworzyć instancję std::vector<whatever>
w oddzielnej jednostce kompilacji i połączyć z nią.
Aby jawnie instancji szablonu, nie używaj extern template
(które nie będzie działać), wystarczy użyć następujących czynności:
#include <vector> // The standard header, not your forward-declaration!
template class std::vector<double>;
Dlaczego "szablon zewnętrzny" nie działa? –
@quant_dev Zapomnij o tym, co powiedziałem, może to po prostu zadziałać (ale twoje eksperymenty sugerują, że tak nie jest w tym przypadku). Z drugiej strony, tak samo wygląda instancja bez 'extern'. –
Tak, działa, gdy szablony nie zawierają definicji metod w definicji klasy. –
Nie można ewentualnie zrobić, że jeśli nie zmieni nagłówek vector
lub dostarczyć jego odpowiednik, który zawiera tylko deklaracje. W przeciwnym razie, gdy podasz jej zawartość, dostaje się ona do pliku włączającego i zostaje skompilowana, a szablony są tworzone przy pierwszym użyciu. Następnie linker eliminuje duplikaty. Tak działa kompilacja C++, nie można tu nic zrobić.
To nie jest dokładnie to. Jeśli klasa szablonu nie zawiera definicji metod WIDZENIA definicji klasy, to mogę dodać deklarację "extern template" PO definicji klasy, a kompilator unika instancji szablonu w punkcie użycia, ufając deklaracji "extern template". To podpowiedź metod, które mnie doprowadzają. –
Co proponuję teraz chciałbym rozważyć włamać, jak to skręcony kod w celu osiągnięcia optymalizacji kompilatora. Flagi kompilatorów powinny zostać sprawdzone przed wypróbowaniem tego.
Podsumowując, kompilator umieszcza w plikach obj jest zależny od kompilatora, ale proponuję spróbować dziedziczyć specjalizację wektora i korzystać z tej specjalizacji. Mogę sobie wyobrazić, że sprawi to, że kompilator utworzy plik obj zawierający specjalizację wektora, pozwalając wszystkim użytkownikom owiniętego wektora używać tego.
Mogę to zrobić, dzięki. –
Od kiedy kompilator C++ Microsoftu obsługuje nawet 'szablon zewnętrzny '? O ile mi wiadomo, jest to po prostu ignorowane. –
To nie jest. Próbowałem go na VS 2008 (z SP1) i działało. –