2012-01-24 3 views
5

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)

+0

Od kiedy kompilator C++ Microsoftu obsługuje nawet 'szablon zewnętrzny '? O ile mi wiadomo, jest to po prostu ignorowane. –

+0

To nie jest. Próbowałem go na VS 2008 (z SP1) i działało. –

Odpowiedz

2

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>; 
+0

Dlaczego "szablon zewnętrzny" nie działa? –

+0

@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'. –

+0

Tak, działa, gdy szablony nie zawierają definicji metod w definicji klasy. –

-1

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ć.

+0

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ą. –

1

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.

+0

Mogę to zrobić, dzięki. –