是否使用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::equal
和std::lexicographical_compare
。 在实践中,这些运算符也应该用这些algorithm来实现(如果不是这样的话,可以向你的供应商投诉)。
唯一很小的担心是有一点额外的编译时间开销,但应该有零代码大小和运行时间的开销。
相关但不完全相同: C ++性能技术报告对内置types( int
, double
)的精简类封装做了很多仔细的testing,并发现2006编译器技术接近零开销。 你可以重复他们的testing来validation这个std::array<T,N>
与T[N]