Класс шаблона скомпилирован несколько раз в разных модулях компиляции в C ++? - PullRequest
3 голосов
/ 29 января 2012

Допустим, у меня есть следующий код:

// templateClass.h
#ifndef TEMPLATE_CLASS_H
#define TEMPLATE_CLASS_H

template <typename T>
class tClass
{
public:
  tClass();
};

#endif

// templateClassDef.inl
#ifndef TEMPLATE_CLASS_DEF_INL
#define TEMPLATE_CLASS_DEF_INL

template <typename T>
tClass<T>::tClass()
{
}

#endif

// normalClass.h
#include "templateClass.h"

class normal
{
public:
  normal();
};

// normalClass.cpp
#include "normalClass.h"
#include "templateClassDef.inl"

normal::normal()
{
  tClass<int> a;
}

// main.cpp
#include "templateClass.h"
#include "templateClassDef.inl"

#include "normalClass.h"

int main()
{
  tClass<int> a;
  normal b;

  return 0;
}

Обратите внимание, что файл inl НЕ включен в заголовок, как обычно, но вместо этого включен в исходные файлы (яосознавать, что это не стандартный способ ... это всего лишь пример).Обратите внимание, что normalcClass.cpp создает экземпляр tClass<int>, как и main.cpp.

. Мне любопытно, должен ли компилятор создавать создание экземпляра из класса шаблона каждый раз, когда он встречает явное создание экземпляра, учитывая егоодин и тот же тип (то есть tClass<int>) , хотя оба экземпляра происходят в отдельных единицах перевода (normalClass.cpp и main.cpp)?Кроме того, будет ли это увеличиваться во время компиляции (если ответ на предыдущий вопрос да, он снова его создаст , тогда это также должно быть да )?

Ответы [ 4 ]

4 голосов
/ 29 января 2012

Обычно шаблоны создаются на единицу компиляции, что увеличивает время компиляции. В новом стандарте C ++ есть некоторые расширения и функции для решения этой проблемы, такие как явная реализация и экстернализация. См. Этот документ для некоторых объяснений и методов оптимизации:

http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html

2 голосов
/ 29 января 2012

В общем, да, классы шаблонов обычно компилируются каждый раз, когда они встречаются компилятором.

1 голос
/ 29 января 2012

Да, модули компиляции компилируются независимо друг от друга.

Однако многие наборы инструментов поддерживают предварительно скомпилированные заголовки, которые обходят это, и позволяют компилятору повторно использовать уже обработанный код в другом модуле компиляции.

1 голос
/ 29 января 2012

Как компилятор реализует механизм создания шаблона, зависит от компилятора.Практически, необходимые и видимые определения шаблона функции создаются, когда он используется в модуле перевода.Это может создать немало ненужной работы.Например, каждый раз, когда вы используете потоки ввода-вывода в модуле трансляции, создаются все соответствующие функции из потокового и языкового классов.... всегда с одними и теми же двумя типами!

В зависимости от того, для чего предназначен шаблон, может оказаться целесообразным поместить реализацию в исходный файл, а не в заголовок и явно создать экземпляр шаблона в исходном коде.Когда используется много разных экземпляров, это не жизнеспособно.В этом случае может быть целесообразно заранее определить широко используемые экземпляры.Для этого вы можете объявить экземпляры extern в C ++ 2011.Конечно, тогда вам необходимо явно создать экземпляр соответствующих функций или классов где-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...