我在一些地方看到了在c++中使用std::array
而不是C风格数组的建议,声称这是一种更好,更安全的替代方案,没有开销。看到:
标准容器数组[…没有额外的空间开销它需要保存它的元素,[…]。换句话说,它是非常就像没有问题的内置数组。(c++ 11 FAQ)
然而,据我所知,作为模板容器,将作为程序大小的开销,因为它将为每个实例化数组的不同N生成代码。
假设我的程序在不同的地方使用std::array
和几个不同的整数N,这会导致臃肿的代码吗?可以忽略不计吗?
我不担心。如果你看一下std::array<T, N>
的接口,它是非常小的,大多数成员函数(基本上为指针操作提供包装器)都是一行程序,将被任何体面的编译器在发布模式优化级别上完全优化/内联。
此外,您不必为不使用付出代价,因为类模板的未使用的非虚成员函数(std::array<T, N>
没有virtual
成员函数)保证不会被实例化。标准报价:
14.7.1隐式实例化[temp.inst]
实现不应该隐式地实例化函数模板、变量模板、成员模板、非虚成员函数、成员类或类模板的静态数据成员这并不需要实例化。[…]
还有一些重载关系操作符==
和<
,它们在语义上等同于std::equal
和std::lexicographical_compare
。在实践中,这些操作符也应该按照这些算法来实现(如果他们不这样做,请向供应商投诉)。
唯一非常小的担心是额外的编译时开销,但是代码大小和运行时开销应该为零。
相关但不完全相同: c++性能技术报告对内置类型(int
, double
)周围的瘦类包装器进行了大量仔细的基准测试,发现2006编译器技术的开销接近于零。您可以重复他们的测试来验证std::array<T,N>
和T[N]