对于模板类,非泛型成员函数是否重复?

时间:2011-07-01 22:06:15

标签: c++ class templates

或者只是实际使用通用零件的那些?

就像这个例子一样:

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 个答案:

答案 0 :(得分:4)

通过模板参数创建的每个类都是它自己的类。也就是说,如果您有foo<int>foo<double>foo<char>,则会存在3种不同的addStuff,clear和setName函数。那是因为会有3个不同的类。模板是编译时实体。它们是在编译过程中引入的,并没有像这样“减少”代码大小。

答案 1 :(得分:3)

从技术上讲,是的,因为它们是属于不同类的不同函数。实际上,也许,因为编译器/链接器非常聪明,并且已经发现在许多情况下可以压缩这样重复的代码。而且总是有可能它们没有被完全内联,因此根本不需要存储实际的功能。

使用模板技巧的可执行文件大小有一定的成本,但它现在不像过去几年那么多。