【问题标题】:For template classes, do non generic member functions get duplicated?对于模板类,非泛型成员函数会重复吗?
【发布时间】:2011-07-01 22:06:14
【问题描述】:

或者只有那些实际使用通用部件的?

就像这个例子:

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 文件中需要专门化。 他们也被复制了吗? 只是好奇...

【问题讨论】:

    标签: c++ class templates


    【解决方案1】:

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

    【讨论】:

    • 如果你真的想的话,你总是可以创建一个非模板基类。 setName 意义不大,但可能对其他情况更有用:class HasName { public: void setName(const std::string&amp; name) { name_ = name; } std::string name_; }; template&lt;class T&gt; class foo : public HasName ...
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2012-01-22
      相关资源
      最近更新 更多