Для шаблонных классов дублируются не универсальные функции-члены? - PullRequest
3 голосов
/ 02 июля 2011

Или только те, которые на самом деле используют общие части?

Как в этом примере:

template<class T>
class foo
{
public:
    void addStuff(int x,T y)
    {

        ints_.push_back(x);
        generics_.push_back(y);
    }
    void clear() 
    {
        ints_.clear();
        generics_.clear();
    }
    void setName(std::string name)
    {

        name_ = name;
    }

    std::string name_;

    std::vector<int> ints_;
    std::vector<T> generics_;
};

Неуниверсальные функции являются встроенными, так как размещение их в файле .cpp потребует специализации. Они тоже дублируются? Просто любопытно ...

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Каждый класс, который создается с помощью параметра шаблона, является своим собственным классом.То есть, если бы у вас было foo<int>, foo<double> и foo<char>, тогда существовали бы 3 разные функции addStuff, clear и setName.Это потому, что будет 3 разных класса.Шаблоны - это объекты времени компиляции.Они вводятся во время компиляции, и нет попытки «уменьшить» размер кода, как это.

3 голосов
/ 02 июля 2011

Технически, да, так как они являются различными функциями, принадлежащими различным классам. На практике, может быть, поскольку компиляторы / компоновщики довольно умны и выяснили, что такой повторяющийся код может быть сжат во многих ситуациях. И всегда существует вероятность того, что они не будут встроены полностью, так что никакая фактическая функция не будет сохранена вообще.

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

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