2012-01-24 5 views
5

Quiero disminuir el tamaño de los archivos .obj en un proyecto grande en el que estoy trabajando (sé que el vinculador elimina las definiciones duplicadas, pero quiero acelerar el proceso de compilación). Una de las razones de su tamaño es que cada clase que usa std::vector<double> o std::vector<std::string> termina compilando el código de esta clase y colocándolo en su archivo .obj. Traté de instanciar explícitamente std::vector<double> y usar extern template declaración, pero no funciona - std::vector en Visual Studio C++ STL tiene todos los métodos en línea. A menos que modifique el código STL (que no haré), ¿hay alguna forma de forzar al compilador a no aplicar métodos instanciados en línea y usar la versión instanciada externamente de std::vector<double>?Evite la incorporación de código std :: vector explícitamente instanciado <T>? (Visual Studio C++ 2008)

+0

¿Desde cuándo el compilador de C++ de Microsoft incluso soporta 'extern template'? Por lo que yo sé, simplemente se ignora. –

+0

No lo es. Lo probé en VS 2008 (con SP1) y funcionó. –

Respuesta

2

Lo único que se le viene a la mente es escribir un encabezado de inclusión que define la plantilla std::vector (pero no sus miembros, estos solo necesitan ser declarados) e incluir eso en lugar del encabezado estándar vector.

A continuación, puede crear una instancia explícita de std::vector<whatever> en una unidad de compilación independiente y establecer un vínculo con eso.

Para crear una instancia explícitamente la plantilla, no use extern template (que no va a funcionar), sólo tiene que utilizar el siguiente:

#include <vector> // The standard header, not your forward-declaration! 

template class std::vector<double>; 
+0

¿Por qué no funciona la plantilla extern? –

+0

@quant_dev Olvida lo que dije, podría funcionar (pero tus experimentos sugieren que no, en este caso). Por otra parte, también lo hace la instanciación sin 'extern'. –

+0

Sí, funciona cuando las plantillas no incluyen definiciones de métodos en la definición de clase. –

-1

No es posible que hacerlo a menos que se altera el encabezado o proporcionar vector su equivalente que solo contiene declaraciones. De lo contrario, siempre que tenga #include, archivo vector, su contenido entra en el archivo incluido y se compila y las plantillas se instancian en el primer uso. Entonces el enlazador elimina los duplicados. Así es como funciona la compilación de C++, aquí no se puede hacer nada.

+0

No es exactamente así. Si la clase de plantilla no contiene definiciones de método DENTRO de la definición de clase, entonces puedo agregar la declaración 'extern template' DESPUÉS de la definición de clase, y el compilador evita crear una instancia de la plantilla en el punto de uso, confiando en la declaración' extern template'. Es la línea de los métodos lo que me atrapa. –

1

Lo que sugiero ahora yo consideraría un hackear, como que enrollar el código para lograr una optimización del compilador. Los indicadores del compilador deben investigarse antes de probar esto.

En general, lo que el compilador coloca en los archivos obj depende del compilador, pero le sugiero que trate de heredar una especialización del vector y utilice esta especialización. Me imagino que esto hará que el compilador cree un archivo obj que contenga la especialización del vector, permitiendo a todos los usuarios del vector envuelto usar esto en su lugar.

+0

Podría hacerlo, gracias. –

Cuestiones relacionadas