是否使用std :: array <T,N>导致代码膨胀?

我曾经在几个地方看到过推荐使用std::array在C ++中使用C风格的数组,声称这是一个更好,更安全的替代scheme,没有开销。 看到:

标准的容器数组没有超出它所需的元素的空间开销,[…]。 换句话说,它非常像一个没有问题的内置数组。 ( C ++ 11 FAQ )

然而,据我所知,作为一个模板容器, 将会有一个开销,只要程序大小,因为它会生成代码为每个不同的Narrays是实例。

假设我的程序在不同的地方使用了std::array ,有N个不同的整数,这会导致代码臃肿吗? 这可以忽略不计吗?

我应该担心这一般的非types模板参数吗?

我不会为此担心的。 如果你看看std::array<T, N>的接口,它是非常小的,大多数成员函数(基本上提供指针操作的包装)是单行程序,将被任何体面的编译器完全优化/内联发布模式优化级别。

此外, 你不支付你不使用的东西,因为类模板的未使用的非虚拟成员函数( std::array<T, N>没有virtual成员函数)保证不被实例化。 小标准报价:

14.7.1隐式实例化[temp.inst]

11实现不应隐式地实例化不需要实例化的类模板的函数模板,variables模板,成员模板,非虚拟成员函数,成员类或静态数据成员。 […]

还有一些重载的关系运算符==<它们在语义上等价于std::equalstd::lexicographical_compare 。 在实践中,这些运算符也应该用这些algorithm来实现(如果不是这样的话,可以向你的供应商投诉)。

唯一很小的担心是有一点额外的编译时间开销,但应该有零代码大小和运行时间的开销。

相关但不完全相同: C ++性能技术报告对内置types( intdouble )的精简类封装做了很多仔细的testing,并发现2006编译器技术接近零开销。 你可以重复他们的testing来validation这个std::array<T,N>T[N]