Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同大小的boost::array实例是否会生成全新的类?_C++_Boost - Fatal编程技术网

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:我删除了。这个更好。