如果我制作这样的代码:
boost::array<10> a1;
boost::array<20> a2;
boost::array<30> a3;
模板是否会为我生成3个不同的类,并使代码的大小增长?
如果是这样,编译器/链接器是否足够智能,只包含我实际使用的方法定义?例如:如果我使用a1对象的'at'方法,但从不使用a2对象的'at'方法,那么a2的'at'将被完全丢弃。
答案 0 :(得分:5)
模板是否会为我生成3个不同的类
是;具有不同模板参数的模板的每个实例化实际上都是不同的类型。
并使代码的大小增长?
极不可能,当然也不比启用内联更差。
如果是这样,编译器/链接器是否足够智能,只包含我实际使用的方法定义?
是的,除非您明确地将类型实例化为整体。
例如:如果我使用a1对象的'at'方法,但从不使用a2对象的'at'方法,那么a2的'at'将被完全丢弃。
如果您从未使用at
的方法a2
,并且您没有明确地将boost::array<T, 20>
实例化为整体,那么boost::array<T, 20>::at()
永远不会被实例化为什么都没有丢弃。