Код шаблона увеличивает размер двоичного файла - PullRequest
5 голосов
/ 24 ноября 2011

Часто говорят, что код с большим количеством шаблонов приведет к увеличению размера вывода, но так ли это на самом деле?

#include <iostream>

#if 0
void foo( const int &v)
{
    std::cout<<v<<std::endl;
}
#else
template< typename T >
void foo( const T &v)
{
    std::cout<<v<<std::endl;
}
#endif

int main ()
{
    foo(50);
}

В приведенном выше примере получаются выходные данные разных размеров (6,19 тыс. С функцией и 6,16 тыс. С функцией шаблона) Почему версия с шаблоном меньше?

Если это имеет значение, я использую g ++ 4.6.1 со следующими параметрами -O3 -Wextra -Wall -pedantic. Я не уверен, что вывод других компиляторов.

Ответы [ 2 ]

6 голосов
/ 24 ноября 2011

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

Для шаблона, если вызов является встроенным, нет никаких оснований для того, чтобы вызывать неявно конкретизированную специализацию шаблона функции.

Попробуйте сделать foo inline функцией или static. Если вы хотите вызвать специализацию шаблона функции, вам нужно явно создать его экземпляр

#else
template< typename T >
void foo( const T &v)
{
    std::cout<<v<<std::endl;
}
template void foo(const int&);
#endif

При этом мои показатели дают одинаковый размер для функции без шаблона и версии шаблона функции.

1 голос
/ 24 ноября 2011

Когда мы говорим, что шаблоны генерируют больший код, мы имеем в виду, что они больше по сравнению с другими формами динамического или статического полиморфизма, такими как виртуальные функции, указатели на функции, выбор, перегрузка функций и т. Д. *

Например, давайте предположим, что у вас очень большой шаблон класса и только в одном месте кода есть разница между int и float. Что ж, наивный компилятор продублирует весь класс и код, и в итоге он получит вдвое больший размер (на самом деле это не так, но давайте предположим, что в этом примере). Если вы только что перегрузили этот единственный метод, дублировалась бы только эта часть кода.

Это также имеет неприятный побочный эффект, заключающийся в увеличении времени компиляции, поскольку он должен оценивать вдвое больше кода.

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

...