模板是否在C ++中浪费空间?

时间:2011-09-25 04:17:09

标签: c++ templates

我正在通过EASTL's list class查看作者如何实现节点。我的期望是一个简单的类/结构。相反,我看到一个基础和一个继承自这个基础的节点(仍然过于简单,但为什么还有两个类?)。他的评论解释了原因:

  

我们与ListNode(下面)分开定义ListNodeBase,因为它允许   我们有非模板化的操作,如插入,删除(下面)和它   使得列表锚点节点不携带T,这样就可以了   由于存在额外的Ts,浪费空间并可能导致用户感到惊讶   用户没有明确创建。所有这一切的缺点是   考虑到节点指针的位置,它会使列表的调试查看更加困难   键入ListNodeBase而不是ListNode。但是,请参阅下面的ListNodeBaseProxy。

我在这里不了解一些事情。我了解有关为什么它会使调试查看更加困难的部分,但list anchor node doesn't carry a T with itwould waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create是什么意思?

3 个答案:

答案 0 :(得分:7)

如果没有辅助类,列表根节点将包含从未使用过的T实例。第二句话是说你可能不希望一个空列表创建一个T.例如,创建一个T可能有副作用。

答案 1 :(得分:1)

在我看来,这个想法是将列表的抽象与它携带的数据分开。当您真正想要访问数据时,您只需要ListNode,其余所有内容都可以在摘要ListNodeBase上完成。这就是我理解list anchor node doesn't carry a T with it

的方式

那里有关于空间的东西。模板类是按类型创建的,所以如果你有几种不同的类型用于T,没有ListNodeBase你会创建每种类型的所有操作的模板副本,用它 - 你没有,并且LinkNode继承了它们,并且只需要实际数据的内存。似乎节省的空间是指在这种情况下代码的实际大小。

答案 2 :(得分:1)

你真的想支持空列表。如果头节点本身总是包含一个T,并且每个列表都包含一个头节点,那么每个列表至少包含一个T,因此永远不会为空。