C++ 不同大小的boost::array实例是否会生成全新的类?
如果我编写一些类似这样的代码:C++ 不同大小的boost::array实例是否会生成全新的类?,c++,boost,C++,Boost,如果我编写一些类似这样的代码: boost::array<10> a1; boost::array<20> a2; boost::array<30> a3; boost::数组a1; boost::阵列a2; boost::阵列a3; 模板会为我生成3个不同的类,并使我的代码的大小增加吗 如果是,编译器/链接器是否足够聪明,只包含我实际使用的方法定义?例如:如果我使用a1对象的方法“at”,但从未使用a2对象的方法“at”,那么a2的方法“at”将被完全丢
boost::array<10> a1;
boost::array<20> a2;
boost::array<30> a3;
boost::数组a1;
boost::阵列a2;
boost::阵列a3;
模板会为我生成3个不同的类,并使我的代码的大小增加吗
如果是,编译器/链接器是否足够聪明,只包含我实际使用的方法定义?例如:如果我使用a1对象的方法“at”,但从未使用a2对象的方法“at”,那么a2的方法“at”将被完全丢弃
模板会为我生成3个不同的类吗
对,;具有不同模板参数的模板的每个实例化实际上都是不同的类型
让我的代码变得更大
极不可能,当然不会比启用内联更糟糕 如果是,编译器/链接器是否足够聪明,只包含我实际使用的方法定义 是的,除非您显式地将类型作为一个整体实例化 例如:如果我使用a1对象的方法“at”,但从未使用a2对象的方法“at”,那么a2的方法“at”将被完全丢弃 如果您从未使用
a2
的at
方法,并且没有将boost::array
作为一个整体显式实例化,那么boost::array::at()
从一开始就不会实例化,也没有什么可以放弃的
模板会为我生成3个不同的类吗
对,;具有不同模板参数的模板的每个实例化实际上都是不同的类型
让我的代码变得更大
极不可能,当然不会比启用内联更糟糕 如果是,编译器/链接器是否足够聪明,只包含我实际使用的方法定义 是的,除非您显式地将类型作为一个整体实例化 例如:如果我使用a1对象的方法“at”,但从未使用a2对象的方法“at”,那么a2的方法“at”将被完全丢弃
如果您从未使用
a2
的at
方法,并且没有将boost::array
作为一个整体显式实例化,那么boost::array::at()
从一开始就不会实例化,也没有什么可以丢弃的。您所说的“整体实例化”是什么意思?@haole:E.g.命名空间boost{template class array;}
“极不可能,肯定不会比启用内联更糟糕。”这是怎么回事?代码必须要放在某个地方。假设我这里说的是使用的成员函数。@Tomalak:boost::array
的成员函数非常简单,而且很可能是内联的;因此在程序中使用不同的boost::array
实例化不太可能增加任何值得注意的大小(如果有的话)。注意好的实现可能会使用减少代码大小的技术。例如,从公共的、私有的非模板基类派生并非闻所未闻。此外,高级链接器能够折叠二进制相同的函数,即使它们在技术上具有不同的类型。你所说的“作为一个整体实例化”是什么意思?@haole:E.g.namespace boost{template class array;}
“极不可能,肯定不会比启用内联更糟糕。”这是怎么回事?代码必须要放在某个地方。假设我这里说的是使用的成员函数。@Tomalak:boost::array
的成员函数非常简单,而且很可能是内联的;因此在程序中使用不同的boost::array
实例化不太可能增加任何值得注意的大小(如果有的话)。注意好的实现可能会使用减少代码大小的技术。例如,从公共的、私有的非模板基类派生并非闻所未闻。此外,高级链接器能够折叠二进制相同的函数,即使它们在技术上具有不同的类型。@Tomalak问题已经解决。@pmr:I已删除。这一个更好。@Tomalak The question死了。@pmr:我删除了。这个更好。